Установка радиуса угла на ячейке приводит к урону 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;