我有一个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
具有与圆角的细胞?
作为@Till在评论中指出,一个预渲染的图像应该解决您的性能问题。 你可以把所有的圆角,阴影,以及其它特效成,而不是需要CA,使它们在飞行中。
预渲染的图像不锁你到静态内容大小,或者:看看到UIImage
可调整大小的图像的东西。 (这仍然比CA渲染每一帧的方式更快。)
我发现,这完全是因为引起调用dequeuereusablecellwithidentifier的。 每个这种被调用的时候,需要重新渲染与圆角的电池。 如果在项目滚动到屏幕的集合视图没有从画面中移除,那么性能不会受到影响(只要他们不是说是集合了太多的项目)。 好像一把双刃剑 - 这两种方式有其局限性。
没有为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];
}
结果: 表具有圆形视图作为细胞
我通过在内容查看,而不是电池本身应用此半径修复了所有的我的表现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;