iOS开发_自定义设置圆角、指定位置设置圆角

【作者前言】:13年入圈,分享些本人工作中遇到的点点滴滴那些事儿,17年刚开始写博客,高手勿喷!以分享交流为主,欢迎各路豪杰点评改进!

1.应用场景:

处理UI控件时,为了好看,比如一些底层背景,需要指定位置设置不同的圆角。

2.实现目标:

利用相关API实现自定义设置圆角值,以左上、右上举例

3.代码说明:

        CGFloat radius = 10; // 圆角值大小
        UIView *view = [[UIView alloc] initWithFrame:CGRectMake(20,100,200,200)];
        if (@available(iOS 11.0, *))
        {
            // 设置 左上 右上 圆角
            view.layer.cornerRadius = radius;
            view.layer.maskedCorners = kCALayerMinXMinYCorner | kCALayerMaxXMinYCorner;
        }else {
            // 设置 左上 右上 圆角
            UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight cornerRadii:CGSizeMake(radius, radius)];
            CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
            maskLayer.frame = view.bounds;
            maskLayer.path = path.CGPath;
            view.layer.mask = maskLayer;
        }

注iOS11.0及以上有新的的API处理相应需求,CACornerMask 枚举值说明

typedef NS_OPTIONS (NSUInteger, CACornerMask)
{
  kCALayerMinXMinYCorner = 1U << 0,  /// 左上角
  kCALayerMaxXMinYCorner = 1U << 1,  /// 右上角
  kCALayerMinXMaxYCorner = 1U << 2,  /// 左下角
  kCALayerMaxXMaxYCorner = 1U << 3,  /// 右下角
};

iOS11.0 之前CACornerMask 枚举值说明

typedef NS_OPTIONS(NSUInteger, UIRectCorner) {
    UIRectCornerTopLeft     = 1 << 0,  /// 左上角
    UIRectCornerTopRight    = 1 << 1,  /// 右上角
    UIRectCornerBottomLeft  = 1 << 2,  /// 左下角
    UIRectCornerBottomRight = 1 << 3,  /// 右下角
    UIRectCornerAllCorners  = ~0UL  /// 四个角
};

综上,提供一个简单的方法可设置任意位置的圆角值

/**
 @brief 设置任意角圆角
 @param view 需要设置的控件
 @param radius    圆角值
 @param positions  位置数组 - @1(左上), @2(右上), @3(左下), @4(右下)
 */
- (void)yp_setCornerRadiusWithView:(UIView *)view radius:(CGFloat)radius positions:(NSArray <NSNumber *>*)positions {
    // view.clipsToBounds = YES; 会触发离屏渲染问题 -  根据实际情况来决定是否放开
    if (@available(iOS 11.0, *)) {
        // 默认四个角
        CACornerMask corners = kCALayerMinXMinYCorner | kCALayerMaxXMinYCorner | kCALayerMinXMaxYCorner | kCALayerMaxXMaxYCorner;
        if (positions.count == 1) { // 只设置了一个角
            NSInteger positionVal = [positions[0] integerValue];
            corners = positionVal == 1 ? kCALayerMinXMinYCorner : positionVal == 2 ? kCALayerMaxXMinYCorner : positionVal == 3 ? kCALayerMinXMaxYCorner : kCALayerMaxXMaxYCorner;
        }else if (positions.count == 2) { // 设置了两个角
            if ([positions containsObject:@1]) {
                if ([positions containsObject:@2]) {// 12
                    corners = kCALayerMinXMinYCorner | kCALayerMaxXMinYCorner;
                }else if ([positions containsObject:@3]) {// 13
                    corners = kCALayerMinXMinYCorner | kCALayerMinXMaxYCorner;
                }else {// 14
                    corners = kCALayerMinXMinYCorner | kCALayerMaxXMaxYCorner;
                }
            }else if ([positions containsObject:@2]) {
                if ([positions containsObject:@3]) { // 23
                    corners = kCALayerMaxXMinYCorner | kCALayerMinXMaxYCorner;
                }else { // 24
                    corners = kCALayerMaxXMinYCorner | kCALayerMaxXMaxYCorner;
                }
            }else {// 34
                corners = kCALayerMinXMaxYCorner | kCALayerMaxXMaxYCorner;
            }
        }else if (positions.count == 3) { // 设置了三个角
            if ([positions containsObject:@1] && [positions containsObject:@2]) {
                if ([positions containsObject:@3]) { // 123
                    corners = kCALayerMinXMinYCorner | kCALayerMaxXMinYCorner | kCALayerMinXMaxYCorner;
                }else { // 124
                    corners = kCALayerMinXMinYCorner | kCALayerMaxXMinYCorner | kCALayerMaxXMaxYCorner;
                }
            }else if ([positions containsObject:@1] && [positions containsObject:@3]) { // 134
                corners = kCALayerMinXMinYCorner | kCALayerMinXMaxYCorner | kCALayerMaxXMaxYCorner;
            }else {// 234
                corners = kCALayerMaxXMinYCorner | kCALayerMinXMaxYCorner | kCALayerMaxXMaxYCorner;
            }
        }
        view.layer.cornerRadius = radius;
        view.layer.maskedCorners = corners;
        
    }else {
        // 默认四个角
        UIRectCorner corners = UIRectCornerTopLeft | UIRectCornerTopRight | UIRectCornerBottomLeft | UIRectCornerBottomRight;
        if (positions.count == 1) { // 只设置了一个角
            NSInteger positionVal = [positions[0] integerValue];
            corners = positionVal == 1 ? UIRectCornerTopLeft : positionVal == 2 ? UIRectCornerTopRight : positionVal == 3 ? UIRectCornerBottomLeft : UIRectCornerBottomRight;
        }else if (positions.count == 2) { // 设置了两个角
            if ([positions containsObject:@1]) {
                if ([positions containsObject:@2]) {// 12
                    corners = UIRectCornerTopLeft | UIRectCornerTopRight;
                }else if ([positions containsObject:@3]) {// 13
                    corners = UIRectCornerTopLeft | UIRectCornerBottomLeft;
                }else {// 14
                    corners = UIRectCornerTopLeft | UIRectCornerBottomRight;
                }
            }else if ([positions containsObject:@2]) {
                if ([positions containsObject:@3]) { // 23
                    corners = UIRectCornerTopRight | UIRectCornerBottomLeft;
                }else { // 24
                    corners = UIRectCornerTopRight | UIRectCornerBottomRight;
                }
            }else {// 34
                corners = UIRectCornerBottomLeft | UIRectCornerBottomRight;
            }
        }else if (positions.count == 3) { // 设置了三个角
            if ([positions containsObject:@1] && [positions containsObject:@2]) {
                if ([positions containsObject:@3]) { // 123
                    corners = UIRectCornerTopLeft | UIRectCornerTopRight | UIRectCornerBottomLeft;
                }else { // 124
                    corners = UIRectCornerTopLeft | UIRectCornerTopRight  | UIRectCornerBottomRight;
                }
            }else if ([positions containsObject:@1] && [positions containsObject:@3]) { // 134
                corners = UIRectCornerTopLeft | UIRectCornerBottomLeft | UIRectCornerBottomRight;
            }else {// 234
                corners = UIRectCornerTopRight | UIRectCornerBottomLeft | UIRectCornerBottomRight;            }
        }
        UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:corners cornerRadii:CGSizeMake(radius, radius)];
        CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
        maskLayer.frame = view.bounds;
        maskLayer.path = path.CGPath;
        view.layer.mask = maskLayer;
    }
}

方法调用

    [self yp_setCornerRadiusWithView:self.imgV radius:16 positions:@[@1,@2]];

效果

image.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,137评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,824评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,465评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,131评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,140评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,895评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,535评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,435评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,952评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,081评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,210评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,896评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,552评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,089评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,198评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,531评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,209评论 2 357

推荐阅读更多精彩内容