Установка радиуса угла на ячейке приводит к урону UICollectionView
У меня есть 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
, в которой есть ячейки с закругленными углами?
Ответы
Ответ 1
Как указано в комментариях, предварительное изображение должно решить вашу проблему с производительностью. Вы можете поместить все угловое округление, затенение и любые другие специальные эффекты в это, вместо того, чтобы нуждаться в CA, чтобы визуализировать их на лету.
Приобретенные изображения не блокируют вас в статическом размере контента: просмотрите файл UIImage
resizable image. (Это еще быстрее, чем CA, отображающий каждый кадр.)
Ответ 2
Я обнаружил, что это вызвано полностью из-за вызова dequeuereusablecell с идентификатором. Каждый раз, когда это вызывается, ячейка с закругленными углами должна быть повторно отображена. Если представление коллекции не удаляло их из представления, когда элемент прокручивался с экрана, тогда производительность не будет затронута (пока их не было слишком много элементов в коллекции). Кажется, как меч с двойным острием - оба пути имеют свои пределы.
Ответ 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];
}
Результат:
Таблица с округленными представлениями как ячейки
Ответ 4
Я исправил все мои проблемы borderRadius, применив этот радиус в 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;