美文网首页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