1. 使用UIView.layer.cornerRadius
進行圓角設(shè)置
view.layer.cornerRadius = 20;
view.layer. masksToBounds = YES; // 部分UIView需要設(shè)置這個屬性
此處view.layer. masksToBounds = YES;
會觸發(fā)離屏渲染占拍,如果在UITableViewCell和UICollectionViewCell中使用略就,嚴重的會掉幀、不流暢
2.使用貝塞爾曲線畫圓角及指定位置圓角
CGFloat radius = 20; // 圓角大小
UIRectCorner corner = UIRectCornerAllCorners; // 圓角位置晃酒,全部位置
UIBezierPath * path = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:corner cornerRadii:CGSizeMake(radius, radius)];
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = view.bounds;
maskLayer.path = path.CGPath;
view.layer.mask = maskLayer;
UIRectCorner 的定義如下
typedef NS_OPTIONS(NSUInteger, UIRectCorner) {
UIRectCornerTopLeft = 1 << 0, // 左上
UIRectCornerTopRight = 1 << 1, // 右上
UIRectCornerBottomLeft = 1 << 2, // 左下
UIRectCornerBottomRight = 1 << 3, // 右下
UIRectCornerAllCorners = ~0UL // 全部位置
};
UIRectCorner 可以使用位運算進行圓角設(shè)置残制,如:
UIRectCorner corner = UIRectCornerTopRight | UIRectCornerBottomRight; // 右上和右下進行圓角
圓角加邊框
CGFloat radius = 20; // 圓角大小
UIRectCorner corner = UIRectCornerAllCorners; // 圓角位置,全部位置
UIBezierPath * path = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:corner cornerRadii:CGSizeMake(radius, radius)];
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = view.bounds;
maskLayer.path = path.CGPath;
// 帶邊框則兩個顏色不要設(shè)置成一樣即可
maskLayer.strokeColor = [UIColor redColor].CGColor;
maskLayer.fillColor = [UIColor yellowColor].CGColor;
[view.layer addSublayer:maskLayer];
3.iOS11 新特性——改善view圓角
if (@available(iOS 11.0, *)) {
view.layer.cornerRadius = radius;
view.layer.maskedCorners = kCALayerMinXMinYCorner; // 左上圓角
}
CACornerMask的定義如下:
typedef NS_OPTIONS (NSUInteger, CACornerMask)
{
kCALayerMinXMinYCorner = 1U << 0, // 左上
kCALayerMaxXMinYCorner = 1U << 1, 右上
kCALayerMinXMaxYCorner = 1U << 2, // 左下
kCALayerMaxXMaxYCorner = 1U << 3, // 右下
};
CACornerMask 如同上面的UIRectCorner 可以使用位運算進行圓角設(shè)置
4.對UIView進行自定義圓角分類
@interface UIView (ACSLayer)
/**
圓角
使用自動布局掖疮,需要在layoutsubviews 中使用
@param radius 圓角尺寸
@param corner 圓角位置
*/
- (void)acs_radiusWithRadius:(CGFloat)radius corner:(UIRectCorner)corner {
if (@available(iOS 11.0, *)) {
self.layer.cornerRadius = radius;
self.layer.maskedCorners = (CACornerMask)corner;
} else {
UIBezierPath * path = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:corner cornerRadii:CGSizeMake(radius, radius)];
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = self.bounds;
maskLayer.path = path.CGPath;
self.layer.mask = maskLayer;
}
}
@end
此方法在iOS 11 中使用iOS 11中的maskedCorners進行圓角設(shè)置初茶,如是iOS 11 一下則使用貝塞爾曲線畫圓角。