不使用cornerRadius设置图片圆角

tableView的性能优化--不使用cornerRadius设置图片圆角

有人问我为什么tableView滑动不流畅,甚至闪退,其实和cell中的圆角头像使用了cornerRadius有关

优化点

行高一定要缓存
不要动态创建子视图
所有子视图都要预先创建
所有的子视图都应该添加到 contentView上

普通

[imageView.layer setCornerRadius:50];// 设置圆角半径
imageView.clipsToBounds = YES;// 超出主层边框就要裁剪掉

第一种方法:通过设置layer的属性,实现圆角(这种方法在iOS9以前可能会造这样设置会触发离屏渲染,比较消耗性能。比如当一个页面上有十几头像这样设置了圆角

会明显感觉到卡顿。
这种就是最常用的,也是最耗性能的。

注意:ios9.0之后对UIImageView的圆角设置做了优化,UIImageView这样设置圆角
不会触发离屏渲染,ios9.0之前还是会触发离屏渲染。而UIButton还是都会触发离屏渲染。

方案一;shapeLayer的实现

#import <UIKit/UIKit.h>

@interface UIImageView (Category)
///使用CAShapeLayer和UIBezierPath设置圆角
- (void) setRoundedCornersSize:(CGFloat)cornersSize ;
@end
#import "UIImageView+Category.h"

@implementation UIImageView (Category)

- (void)setRoundedCornersSize:(CGFloat)cornersSize {
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds
                                          cornerRadius:cornersSize];
    CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
    maskLayer.frame = self.bounds;
    maskLayer.path = maskPath.CGPath;
    self.layer.mask = maskLayer;    
}

@end

其他方案

最好的是#pragma mark - 通过Graphics 和 BezierPath 设置圆角

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"keai"]];
    imageView.backgroundColor = [UIColor yellowColor];
    imageView.frame = CGRectMake(100, 100, self.view.frame.size.width - 200, self.view.frame.size.width - 200);
    [self.view addSubview:imageView];
//    [self setGraphicsCutCirculayWithView:imageView roundedCornersSize:100];
    [self setLayerAndBezierPathCutCircularWithView:imageView roundedCornersSize:100];

}
#pragma mark -  通过设置layer 切圆角
- (void)setLayerCutCirculayWithView:(UIView *) view roundedCornersSize:(CGFloat )cornersSize
{
    view.layer.masksToBounds = YES;
    // 设置圆角半径
    view.layer.cornerRadius = cornersSize;
}

#pragma mark - 通过layer和bezierPath 设置圆角
- (void)setLayerAndBezierPathCutCircularWithView:(UIView *) view roundedCornersSize:(CGFloat )cornersSize
{
    // 创建BezierPath 并设置角 和 半径 这里只设置了 左上 和 右上
    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight cornerRadii:CGSizeMake(cornersSize, cornersSize)];
    CAShapeLayer *layer = [[CAShapeLayer alloc] init];
    layer.frame = view.bounds;
    layer.path = path.CGPath;
    view.layer.mask = layer;
}

#pragma mark - 通过Graphics 和 BezierPath 设置圆角
- (void)setGraphicsCutCirculayWithView:(UIImageView *) view roundedCornersSize:(CGFloat )cornersSize
{
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, 1.0);
    [[UIBezierPath bezierPathWithRoundedRect:view.bounds cornerRadius:cornersSize] addClip];
    [view drawRect:view.bounds];
    view.image = UIGraphicsGetImageFromCurrentImageContext();
    // 结束
    UIGraphicsEndImageContext();
}

@end
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值