修改layer的anchorPoint需要注意的问题

当我们需要做旋转动画时,默认情况都是以视图的中点作为轴进行旋转的,但有时我们需要改变旋转的轴,这个时候需要通过改变视图layer的anchorPoint属性来满足需求。

anchorPoint是一个CGPoint类型,取值范围为(0, 0)~(1, 1),默认值为(0.5, 0.5)。但直接改变anchorPoint会意外的发现视图的位置改变了。看下面这个例子:

self.aView = UIView(frame: CGRect(x: 0, y: 0, width: 120, height: 120))
self.aView.backgroundColor = UIColor.blackColor()
self.view.addSubview(aView)

println("view‘s bounds: \(self.aView.bounds)")
println("view‘s frame: \(self.aView.frame)")
println("view‘s center: \(self.aView.center)")

println("layer‘s bounds: \(self.aView.layer.bounds)")
println("layer‘s frame: \(self.aView.layer.frame)")
println("layer‘s position: \(self.aView.layer.position)")
println("layer‘s anchorPoint: \(self.aView.layer.anchorPoint)")

self.aView.layer.anchorPoint = CGPoint(x: 0, y: 0)

println()
println("view‘s bounds: \(self.aView.bounds)")
println("view‘s frame: \(self.aView.frame)")
println("view‘s center: \(self.aView.center)")

println("layer‘s bounds: \(self.aView.layer.bounds)")
println("layer‘s frame: \(self.aView.layer.frame)")
println("layer‘s position: \(self.aView.layer.position)")
println("layer‘s anchorPoint: \(self.aView.layer.anchorPoint)")

这段代码很容易理解,创建了一个UIView,是一个边长为120的正方形,起点为屏幕的原点。当改变其anchorPoint时发现它在屏幕中的位置改变了。通过打印view和layer位置相关的属性,发现view的center与layer的position、anchorPoint是关联在一起的,在屏幕中指同一个点。改变anchorPoint时,这三个值还是指向同一个点,但layer的frame的origin将会改变。

为了解决这个问题有两种方法:

1. 定义一个私有方法传入改变后的anchorPoint,和需要改变anchorPoint的view

private func setAnchorPoint(anchoPoint: CGPoint, forView view: UIView) {
    var newPoint: CGPoint = CGPoint(x: view.bounds.width * anchoPoint.x, y: view.bounds.height * anchoPoint.y)
    var oldPoint: CGPoint = CGPoint(x: view.bounds.width * view.layer.anchorPoint.y, y: view.bounds.height * view.layer.anchorPoint.y)

    newPoint = CGPointApplyAffineTransform(newPoint, view.transform)
    oldPoint = CGPointApplyAffineTransform(oldPoint, view.transform)

    var position = view.layer.position
    position.x -= oldPoint.x
    position.x += newPoint.x

    position.y -= oldPoint.y
    position.y += newPoint.y

    view.layer.position = position
    view.layer.anchorPoint = anchoPoint
}

2. 直接修改该view的frame

var originRect = self.aView.frame
self.aView.layer.anchorPoint = CGPoint(x: 0, y: 0)
self.aView.frame = originRect

经过测试,两种方式的结果是相同的。

时间: 2024-10-08 10:04:41

修改layer的anchorPoint需要注意的问题的相关文章

修改UIView的默认Layer后,修改View的值会动态修改Layer的值

效果图: 如上图所示,当我们修改了一个UIView的子类中的Layer内置类型时(如上图中我们将CALayer直接替换成了CAGradientLayer类),会直接作用到其内置的Layer当中. 我们可以用这个特性将Layer封装到View当中,然后直接修改view就能达到我们想要实现的目的. 源码: // // AlphaView.h // YXMWeather // // Created by XianMingYou on 15/2/20. // Copyright (c) 2015年 Xi

彻底理解position与anchorPoint

引言 相信初接触到CALayer的人都会遇到以下几个问题: 为什么修改anchorPoint会移动layer的位置? CALayer的position点是哪一点呢? anchorPoint与position有什么关系? 我也迷惑过,找过网上的教程,大部分都是复制粘贴的,有些是翻译的文章但很有问题,看得似懂非懂,还是自己写代码彻底弄懂了,做点笔记吧. 每一个UIView内部都默认关联着一个CALayer, UIView有frame.bounds和center三个属性,CALayer也有类似的属性,

ios开发讲解之anchorPoint和position详解

(此篇文章为转载,感谢原作者描述的很准确) 引言 相信初接触到CALayer的人都会遇到以下几个问题:  为什么修改anchorPoint会移动layer的位置? CALayer的position点是哪一点呢? anchorPoint与position有什么关系? 每一个UIView都默认关联着一个CALayer, UIView有frame.bounds和center三个属性,CALayer也有类似的属性,分别为frame.bounds.position.anchorPoint.那positio

说说anchorPoint

anchorPoint属性是CGPoint(x,y) ,x,y的取值是按比例取值,一般用0~1,默认是(0.5,0.5),表示图层的position在自身的位置,举个例子, 在红色view确定完大小位置后,如果修改layer的定位点也就是anchorPoint,会让红色view的中心点position发生偏移,此时的定位点在箭头指向的地方,anchorPoint的取值是layer左上角是(0,0),右下角是(1,1),layer的中心因为anchorPoint的改变而改变,anchorPoint

iOS概念:frame,bound,center, anchorPoint

frame: View在它的Super View坐标系里的坐标 bound: 用来定义View自身坐标系和边界的Rect,Rect的原点表示View自身坐标系的原点坐标.举个例子: 一般情况下bound的值为(0,0,width,heigh),其中0,0表示View自身坐标系的原点坐标为(0,0) 但是既然类型是Rect,我也可以设置bound的原定为非(0,0)啊,比如bound值为(10,10,width,height). 这样则表示View自身的坐标系中原点的坐标为(10,10).这对于V

初识CALayer之position与anchorPoint

转载:http://www.cnblogs.com/benbenzhu/p/3615516.html 引言 相信初接触到CALayer的人都会遇到以下几个问题: 为什么修改anchorPoint会移动layer的位置?CALayer的position点是哪一点呢?anchorPoint与position有什么关系? 我也迷惑过,找过网上的教程,大部分都是复制粘贴的,有些是翻译的文章但很有问题,看得似懂非懂,还是自己写代码彻底弄懂了,做点笔记吧. 每一个UIView内部都默认关联着一个CALaye

position与anchorPoint

相信初接触到CALayer的人都会遇到以下几个问题: 为什么修改anchorPoint会移动layer的位置?CALayer的position点是哪一点呢?anchorPoint与position有什么关系? 我也迷惑过,找过网上的教程,大部分都是复制粘贴的,有些是翻译的文章但很有问题,看得似懂非懂,还是自己写代码彻底弄懂了,做点笔记吧. 每一个UIView内部都默认关联着一个CALayer, UIView有frame.bounds和center三个属性,CALayer也有类似的属性,分别为fr

Cocoa中层(layer)坐标系的极简理解

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) Cocoa层的坐标系一直理解的不清晰,现在把它整理总结一下: 1: layer在super layer中的位置由frame属性来确定,而bounds属性的原点永远是(0,0),因为bounds相对的layer自己. 2: layer还有一个position属性,它就是锚点在super layer 中的位置.它和锚点有着直接的关系,虽然它和锚点不在一个坐标系中,

iOS开发——UIImageView的contentMode、裁剪和layer属性详解

在我们iOS开发过程中,UIImageView是一个非常常见的控件,但是我们未必会用的很溜,因为里面的有些属性不曾注意,或者很难理解.所以会对我们使用该控件带来麻烦,在布局UI过程中可能会造成意想不到的结果.这篇博客主要来讲解UIImageView中的contentMode属性以及和图片裁剪的关系,并且不得不提到就是所有UIView的重要属性:layer(CALayer).文中提到的所有·示例代码上传至 https://github.com/chenyufeng1991/ImageWithMod