使用Masonry, 发现设置圆角不起作用

问题:
1,通过
view.layer.cornerRadius = 10.0;
view.layer.masksToBounds = YES;
设置圆角可以

2,设置部分圆角不起作用

原因:
在使用了masonry之后,view的fream和bounds都是0,所以在设置圆角就不会起作用。

解决方法:
当设置完控件的约束,需要调用layoutIfNeeded 函数进行布局,然后所约束的控件才会按照约束条件,生成当前布局相应的frame和bounds。这样就可以利用这两个属性来进行图片圆角剪裁。

圆角设置方法:

将下列方法加入到view的分类里:

-(void)viewSetCorners:(UIRectCorner)corners radius:(CGFloat)radius {
    UIBezierPath*maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:corners cornerRadii:CGSizeMake(radius,radius)];
    CAShapeLayer *maskLayer = [CAShapeLayer layer];
    maskLayer.frame = self.bounds;
    maskLayer.path = maskPath.CGPath;
    self.layer.mask = maskLayer;
}

使用方法:

[view viewSetCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight radius:10.0];

关于autolayout的几个方法:

setNeedsLayout:告知页面需要更新,但是不会立刻开始更新。执行后会立刻调用layoutSubviews。
layoutIfNeeded:告知页面布局立刻更新。所以一般都会和setNeedsLayout一起使用。如果希望立刻生成新的frame需要调用此方法,利用这点一般布局动画可以在更新布局后直接使用这个方法让动画生效。
layoutSubviews:系统重写布局
setNeedsUpdateConstraints:告知需要更新约束,但是不会立刻开始
updateConstraintsIfNeeded:告知立刻更新约束
updateConstraints:系统更新约束

参考:https://www.jianshu.com/p/6a61b5fa5d16

你可能感兴趣的:(使用Masonry, 发现设置圆角不起作用)