13

我有一个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具有圆角单元格的性能?

4

4 回答 4

11

正如@Till 在评论中指出的那样,预渲染图像应该可以解决您的性能问题。您可以将所有圆角、阴影和任何其他特殊效果放入其中,而不需要 CA 即时渲染它们。

预渲染图像也不会将您锁定在静态内容大小中:查看UIImage可调整大小的图像内容。(这仍然比 CA 渲染每一帧要快得多。)

于 2012-12-20T22:52:09.907 回答
1

我发现这完全是由于对 dequeuereusablecellwithidentifier 的调用引起的。每次调用时,都需要重新渲染圆角单元格。如果在项目滚动离开屏幕时集合视图没有将它们从视图中删除,那么性能不会受到影响(只要它们在集合中的项目不是太多)。似乎是一把双刃剑——两种方式都有其局限性。

于 2012-12-21T19:51:57.537 回答
1

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];
}

结果: 带有圆形视图的表格作为单元格

于 2016-07-12T09:19:25.253 回答
0

我通过在 contentView 而不是单元格本身上应用这个半径来修复我所有的性能边界半径问题。

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;
于 2016-08-31T16:28:18.443 回答