效果图:
如下所示调用方法两句话 很简单:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 200, 100)];
label.backgroundColor = [UIColor blueColor];
[self.view addSubview:label];
UIRectCorner corners = UIRectCornerTopRight | UIRectCornerBottomRight;
[label setBorderWithCornerRadius:50 borderWidth:10 borderColor:[UIColor redColor] type:corners];
}
UIView 类别里面的实现:
@implementation UIView (lcAnyCorners)
- (void)setBorderWithCornerRadius:(CGFloat)cornerRadius
borderWidth:(CGFloat)borderWidth
borderColor:(UIColor *)borderColor
type:(UIRectCorner)corners {
// UIRectCorner type = UIRectCornerTopRight | UIRectCornerBottomRight | UIRectCornerBottomLeft;
//1. 加一个layer 显示形状
CGRect rect = CGRectMake(borderWidth/2.0, borderWidth/2.0,
CGRectGetWidth(self.frame)-borderWidth, CGRectGetHeight(self.frame)-borderWidth);
CGSize radii = CGSizeMake(cornerRadius, borderWidth);
//create path
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:corners cornerRadii:radii];
//create shape layer
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.strokeColor = borderColor.CGColor;
shapeLayer.fillColor = [UIColor clearColor].CGColor;
shapeLayer.lineWidth = borderWidth;
shapeLayer.lineJoin = kCALineJoinRound;
shapeLayer.lineCap = kCALineCapRound;
shapeLayer.path = path.CGPath;
[self.layer addSublayer:shapeLayer];
//2. 加一个layer 按形状 把外面的减去
CGRect clipRect = CGRectMake(0, 0,
CGRectGetWidth(self.frame)-1, CGRectGetHeight(self.frame)-1);
CGSize clipRadii = CGSizeMake(cornerRadius, borderWidth);
UIBezierPath *clipPath = [UIBezierPath bezierPathWithRoundedRect:clipRect byRoundingCorners:corners cornerRadii:clipRadii];
CAShapeLayer *clipLayer = [CAShapeLayer layer];
clipLayer.strokeColor = borderColor.CGColor;
shapeLayer.fillColor = [UIColor clearColor].CGColor;
clipLayer.lineWidth = 1;
clipLayer.lineJoin = kCALineJoinRound;
clipLayer.lineCap = kCALineCapRound;
clipLayer.path = clipPath.CGPath;
self.layer.mask = clipLayer;
}
@end
github 地址: https://github.com/lc081200/AnyCornersExample