最近遇到这样一个问题。我在storyboard里面拖了一个imageview,拉了约束使其适应各个屏幕的大小。然后要再这个imageview里面用CAshapeLayer画个圆,代码如下:
circlePathLayer = [CAShapeLayer new];
[circlePathLayer setPath:[UIBezierPath bezierPathWithOvalInRect:frame].CGPath];
circlePathLayer.lineWidth = 10;
circlePathLayer.strokeColor = [UIColor whiteColor].CGColor;
[self.layer addSublayer:circlePathLayer];
这段代码加在view did load里面,可是运行出来是个椭圆,我的imageview是一个正方形,那么应该是个正圆才对。
打印了一下imageview的frame,发现长宽不等,明明是一个正方形,为什么长宽不相等。
后来考虑到是约束的问题,在viewdidload里面可能约束还没有更新,所以获取的frame也是错的。
从view controller生命周期看,
view did load
view will appear
view will layout subviews
view did layout subviews
view did appear
view will disappear
view did disappear
分别在view did load, view will appear, view will layout subviews, view did layout subviews, view did appear里面打印下image view 的frame.
发现,从view did layout subviews才出现正方形的frame,所以上述添加cashapelayer画圆的代码应该放在view did layout subview里面。
可是,view will/did layout subviews在view controller 的生命周期里面是执行不止一次的,所以还应该先判断看 circlePathLayer是否已经存在,如果不存在则添加。搞定。
孕孕的三个问题之——使用 Auto Layout 之后什么时候才能获得正确的 frame
由CAShapeLayer引发的另外一个问题。
一般我们设置view 圆角是通过view.setCornerRadius
view.masksToBounds = YES
来设置。
我通过用CAShapLayer做一个mask这个方法来实现。
还是frame的问题,我对table view cell中的一个UIView对象进行mask,要获取到这个View的正确frame才能正确mask。cell也是在story board中做的,那么也就是说只有在view did layout subviews里面才能获取cell中view的正确frame,那怎么样获取这个正确地frame呢,在table view controller中的view did layout subviews方法中遍历所有的cell来设置layer.mask吗?感觉这方法太笨,有没有好办法呢?
网友评论