一、正常圓角的實現(xiàn)
在做項目過程中,我們總會遇到實現(xiàn)圓角的情況,當(dāng)然最簡單是四個角都改為圓角,如下代碼:
- (UIImageView *)mainImageView {
if (!_mainImageView) {
_mainImageView = [[UIImageView alloc] init];
_mainImageView.layer.cornerRadius = 5.0;
_mainImageView.layer.masksToBounds = YES;
}
return _mainImageView;
}
二、一個或部分圓角的實現(xiàn)
但是項目中也會遇到針對某一個View只畫半邊圓角,或者只畫某一個角的情況,此時我們就不能再使用上面的代碼了。如下圖中的下側(cè)的黑色浮層:
藉此,也通過借鑒前人的經(jīng)驗及自己出現(xiàn)的問題,封裝了兩個Category方法,希望能幫助遇到這些需求的朋友。
UIView+LSCore.h 中的實現(xiàn)
#import <UIKit/UIKit.h>
@interface UIView (LSCore)
#pragma mark - 設(shè)置部分圓角
/**
* 設(shè)置部分圓角(絕對布局)
*
* @param corners 需要設(shè)置為圓角的角 UIRectCornerTopLeft | UIRectCornerTopRight | UIRectCornerBottomLeft | UIRectCornerBottomRight | UIRectCornerAllCorners
* @param radii 需要設(shè)置的圓角大小 例如 CGSizeMake(20.0f, 20.0f)
*/
- (void)addRoundedCorners:(UIRectCorner)corners
withRadii:(CGSize)radii;
/**
* 設(shè)置部分圓角(相對布局)
*
* @param corners 需要設(shè)置為圓角的角 UIRectCornerTopLeft | UIRectCornerTopRight | UIRectCornerBottomLeft | UIRectCornerBottomRight | UIRectCornerAllCorners
* @param radii 需要設(shè)置的圓角大小 例如 CGSizeMake(20.0f, 20.0f)
* @param rect 需要設(shè)置的圓角view的rect
*/
- (void)addRoundedCorners:(UIRectCorner)corners
withRadii:(CGSize)radii
viewRect:(CGRect)rect;
@end
UIView+LSCore.m 中的實現(xiàn)
#import "UIView+LSCore.h"
@implementation UIView (LSCore)
#pragma mark - 設(shè)置部分圓角
/**
* 設(shè)置部分圓角(絕對布局)
*
* @param corners 需要設(shè)置為圓角的角 UIRectCornerTopLeft | UIRectCornerTopRight | UIRectCornerBottomLeft | UIRectCornerBottomRight | UIRectCornerAllCorners
* @param radii 需要設(shè)置的圓角大小 例如 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;
}
/**
* 設(shè)置部分圓角(相對布局)
*
* @param corners 需要設(shè)置為圓角的角 UIRectCornerTopLeft | UIRectCornerTopRight | UIRectCornerBottomLeft | UIRectCornerBottomRight | UIRectCornerAllCorners
* @param radii 需要設(shè)置的圓角大小 例如 CGSizeMake(20.0f, 20.0f)
* @param rect 需要設(shè)置的圓角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布局,所以使用第二方法,因為當(dāng)你進(jìn)行相對布局的時候系統(tǒng)是不確定你的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;
}
四、結(jié)語
在自己在工作過程中也總結(jié)了不少技術(shù)點、封裝了一些Category及工具類,等有時間我會將這些分享給大家,希望能幫到有需求的人,共勉!