1. 给view加圆角很简单,直接用下面2句代码。
rectView.clipsToBounds = YES;
rectView.layer.cornerRadius = 20;
如下图:
2. 还可以给view4个角,任意设置圆角
UIRectCorner rectCorner = UIRectCornerTopLeft | UIRectCornerTopRight ;
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rectView.bounds byRoundingCorners:rectCorner cornerRadii:CGSizeMake(20, 20)];
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.path = path.CGPath;
rectView.layer.mask = shapeLayer;
注意:但是在使用masonry设置view后发现,设置任意角的圆角不起作用。
这是因为在使用了masonry之后,view的fream和bounds都是0,所以在设置圆角就不会起作用。
解决方法:
当设置完控件的约束,需要调用layoutIfNeeded 函数进行布局,然后所约束的控件才会按照约束条件,生成当前布局相应的frame和bounds。这样就可以利用这两个属性来进行图片圆角剪裁。
下面是我写的一个view分类中的设置圆角方法
/**
* setCornerRadius 给view设置圆角
* @param value 圆角大小
* @param rectCorner 圆角位置
**/
- (void)setCornerRadius:(CGFloat)value addRectCorners:(UIRectCorner)rectCorner{
[self layoutIfNeeded];//这句代码很重要,不能忘了
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:rectCorner cornerRadii:CGSizeMake(value, value)];
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.frame = self.bounds;
shapeLayer.path = path.CGPath;
self.layer.mask = shapeLayer;
}
下面附上关于autolayout更新几个方法的区别:
setNeedsLayout:告知页面需要更新,但是不会立刻开始更新。执行后会立刻调用layoutSubviews。
layoutIfNeeded:告知页面布局立刻更新。所以一般都会和setNeedsLayout一起使用。如果希望立刻生成新的frame需要调用此方法,利用这点一般布局动画可以在更新布局后直接使用这个方法让动画生效。
layoutSubviews:系统重写布局
setNeedsUpdateConstraints:告知需要更新约束,但是不会立刻开始
updateConstraintsIfNeeded:告知立刻更新约束
updateConstraints:系统更新约束