美文网首页iOS开发技能iOSiOS分享世界
iOS 实现半边圆角或部分圆角

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

作者: 王隆帅 | 来源:发表于2016-03-09 14:40 被阅读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及工具类,等有时间我会将这些分享给大家,希望能帮到有需求的人,共勉!

    相关文章

      网友评论

      • 我只是个仙:用在xib控件上 在awakeFromNib方法中,没有任何效果啊
      • Sunny_Jiang:用Monsary的话第二种感觉也好难用,要给精确值:joy:
        4021606a5cc9:创建 UIView 子类,在子类里面覆盖 layoutSubviews() 方法,可以拿到当前 View 的 Size。
      • jooooker:涨知识了。感谢楼主!!
      • 徽Se头像:https://github.com/alenQingshan/GetCornerRadius.git 不影响性能的圆角
        徽Se头像:@文超 layer.cornerRadius使用的是cpu,绘制是使用gpu,性能的定义,不是用耗时来评判的
        文文2020:我用你的方法跟楼主的方法做了测试 以加载 100*4张图片为例 发现楼主的方法耗时更少 不知道是不是我用的方式不对 另外 如果是全切 切圆角的话 layer.cornerRadius 耗时最少:scream_cat: :scream_cat: 性能这种东西 到底靠什么评判的:joy_cat:
        王隆帅:@徽Se头像 谢谢:smile:
      • 菲式爱情:感谢分享
        王隆帅:@菲式爱情 共勉!:blush:

      本文标题:iOS 实现半边圆角或部分圆角

      本文链接:https://www.haomeiwen.com/subject/kszzkttx.html