iOS开发技能iOSiOS分享世界

iOS 实现半边圆角或部分圆角

2016-03-09  本文已影响11485人  王隆帅

一、正常圆角的实现

在做项目过程中,我们总会遇到实现圆角的情况,当然最简单是四个角都改为圆角,如下代码:

- (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及工具类,等有时间我会将这些分享给大家,希望能帮到有需求的人,共勉!

上一篇下一篇

猜你喜欢

热点阅读