在小区设置圆角半径杀死UICollectionView的表现(Setting corner radi

2019-07-17 11:27发布

我有一个UICollectionView一个只有少数细胞(约20)。 表现为这个集合的伟大工程。 然而,当我试图把在角落UICollectionViewCells正在由这种观点呈现,我的表现需要显著的打击。 在我的手机的init()方法,这是我加入使得这个唯一的线路:

[self.layer setCornerRadius:15];

由于这是在init方法,我适当重复使用的单元格,我不明白为什么要这样害我的问题。

我曾尝试调整使用以下的多种组合卖出的光栅化和透明度,有还是没有效果:

[self.layer setMasksToBounds:YES];
[self.layer setCornerRadius:15];
[self.layer setRasterizationScale:[[UIScreen mainScreen] scale]];
self.layer.shouldRasterize = YES;
self.layer.opaque = YES;

是他们的一些设置或技巧来提高性能UICollectionView具有与圆角的细胞?

Answer 1:

作为@Till在评论中指出,一个预渲染的图像应该解决您的性能问题。 你可以把所有的圆角,阴影,以及其它特效成,而不是需要CA,使它们在飞行中。

预渲染的图像不锁你到静态内容大小,或者:看看到UIImage可调整大小的图像的东西。 (这仍然比CA渲染每一帧的方式更快。)



Answer 2:

我发现,这完全是因为引起调用dequeuereusablecellwithidentifier的。 每个这种被调用的时候,需要重新渲染与圆角的电池。 如果在项目滚动到屏幕的集合视图没有从画面中移除,那么性能不会受到影响(只要他们不是说是集合了太多的项目)。 好像一把双刃剑 - 这两种方式有其局限性。



Answer 3:

没有为UIView子类,这是为您提供不透明的圆角边框和中间透明孔美景的代码。 您应该创建所需的视图如常之后,你可以用孔在你的视图中添加视图。 可视化是在这里 。

如果您使用UICollectionView或UITableView的一个颜色的背景它的工作原理,你可以添加以下的每个细胞子视图:

@interface TPRoundedFrameView : UIView

@property (assign, nonatomic) CGFloat cornerRadius;
@property (strong, nonatomic) UIColor * borderColor;

@end

@implementation TPRoundedFrameView

- (instancetype)init {
    if ((self = [super init])) {
        self.opaque = NO;
        self.backgroundColor = [UIColor clearColor];
    }
    return self;
}

- (void)drawRect:(CGRect)rect {
    [super drawRect:rect];

    UIBezierPath * path = [UIBezierPath bezierPathWithRect:rect];
    UIBezierPath * innerPath = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:self.cornerRadius];
    [path appendPath:[innerPath bezierPathByReversingPath]];
    [self.borderColor set];
    [path fill];
}

@end

例如用于靶细胞类:

- (void)awakeFromNib {
    [super awakeFromNib];
    // creating holed view with rounded corners
    self.myRoundedView.backgroundColor = [UIColor whiteColor];
    TPRoundedFrameView * roundedFrame = [TPRoundedFrameView new];
    roundedFrame.cornerRadius = 5.f;
    roundedFrame.borderColor = [UIColor groupTableViewBackgroundColor];

    // add borders to your view with appropriate constraints
    [self.myRoundedView addSubview:roundedFrame];

    roundedFrame.translatesAutoresizingMaskIntoConstraints = NO;
    NSDictionary * views = NSDictionaryOfVariableBindings(roundedFrame);
    NSArray * horizontal = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[roundedFrame]-0-|" options:0 metrics:nil views:views];
    NSArray * vertical = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[roundedFrame]-0-|" options:0 metrics:nil views:views];
    [self.myRoundedView addConstraints:horizontal];
    [self.myRoundedView addConstraints:vertical];
}

结果: 表具有圆形视图作为细胞



Answer 4:

我通过在内容查看,而不是电池本身应用此半径修复了所有的我的表现borderRadius问题。

self.contentView.layer.borderWidth = 1.0f;
self.contentView.layer.cornerRadius = 5.0f;
self.contentView.layer.borderColor = [UIColor colorWithRed:202/255. green:202/255. blue:202/255. alpha:1.0].CGColor;


文章来源: Setting corner radius on a cell kills UICollectionView's performance