一、正常圆角的实现
在做项目过程中,我们总会遇到实现圆角的情况,当然最简单是四个角都改为圆角,如下代码:
- (UIImageView *)mainImageView {
if (!_mainImageView) {
_mainImageView = [[UIImageView alloc] init];
_mainImageView.layer.cornerRadius = 5.0;
_mainImageView.layer.masksToBounds = YES;
}
return _mainImageView;
}
二、一个或部分圆角的实现
但是项目中也会遇到针对某一个View只画半边圆角,或者只画某一个角的情况,此时我们就不能再使用上面的代码了。如下图中的下侧的黑色浮层:
藉此,也通过借鉴前人的经验及自己出现的问题,封装了两个Category方法,希望能帮助遇到这些需求的朋友。
UIView+LSCore.h 中的实现
#import <UIKit/UIKit.h>
@interface UIView (LSCore)
#pragma mark - 设置部分圆角
/**
* 设置部分圆角(绝对布局)
*
* @param corners 需要设置为圆角的角 UIRectCornerTopLeft | UIRectCornerTopRight | UIRectCornerBottomLeft | UIRectCornerBottomRight | UIRectCornerAllCorners
* @param radii 需要设置的圆角大小 例如 CGSizeMake(20.0f, 20.0f)
*/
- (void)addRoundedCorners:(UIRectCorner)corners
withRadii:(CGSize)radii;
/**
* 设置部分圆角(相对布局)
*
* @param corners 需要设置为圆角的角 UIRectCornerTopLeft | UIRectCornerTopRight | UIRectCornerBottomLeft | UIRectCornerBottomRight | UIRectCornerAllCorners
* @param radii 需要设置的圆角大小 例如 CGSizeMake(20.0f, 20.0f)
* @param rect 需要设置的圆角view的rect
*/
- (void)addRoundedCorners:(UIRectCorner)corners
withRadii:(CGSize)radii
viewRect:(CGRect)rect;
@end
UIView+LSCore.m 中的实现
#import "UIView+LSCore.h"
@implementation UIView (LSCore)
#pragma mark - 设置部分圆角
/**
* 设置部分圆角(绝对布局)
*
* @param corners 需要设置为圆角的角 UIRectCornerTopLeft | UIRectCornerTopRight | UIRectCornerBottomLeft | UIRectCornerBottomRight | UIRectCornerAllCorners
* @param radii 需要设置的圆角大小 例如 CGSizeMake(20.0f, 20.0f)
*/
- (void)addRoundedCorners:(UIRectCorner)corners
withRadii:(CGSize)radii {
UIBezierPath* rounded = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:corners cornerRadii:radii];
CAShapeLayer* shape = [[CAShapeLayer alloc] init];
[shape setPath:rounded.CGPath];
self.layer.mask = shape;
}
/**
* 设置部分圆角(相对布局)
*
* @param corners 需要设置为圆角的角 UIRectCornerTopLeft | UIRectCornerTopRight | UIRectCornerBottomLeft | UIRectCornerBottomRight | UIRectCornerAllCorners
* @param radii 需要设置的圆角大小 例如 CGSizeMake(20.0f, 20.0f)
* @param rect 需要设置的圆角view的rect
*/
- (void)addRoundedCorners:(UIRectCorner)corners
withRadii:(CGSize)radii
viewRect:(CGRect)rect {
UIBezierPath* rounded = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:corners cornerRadii:radii];
CAShapeLayer* shape = [[CAShapeLayer alloc] init];
[shape setPath:rounded.CGPath];
self.layer.mask = shape;
}
@end
注意:两种方法是一个针对绝对布局一个针对相对布局,本人因为使用Monsary布局,所以使用第二方法,因为当你进行相对布局的时候系统是不确定你的rect的,所以需要自己告诉它。
三、示例如下:
- (UIImageView *)blackBGimageView {
if (!_blackBGimageView) {
_blackBGimageView = [[UIImageView alloc] init];
_blackBGimageView.backgroundColor = black_color;
_blackBGimageView.alpha = 0.7;
[_blackBGimageView addRoundedCorners:UIRectCornerBottomLeft|UIRectCornerBottomRight withRadii:CGSizeMake(5.0, 5.0) viewRect:CGRectMake(0, 0, ((SCREEN_WIDTH - 4*10)/2.0), 35)];
}
return _blackBGimageView;
}
四、结语
在自己在工作过程中也总结了不少技术点、封装了一些Category及工具类,等有时间我会将这些分享给大家,希望能帮到有需求的人,共勉!