UICollectionViewCell с закругленными углами И не работает тень

Я хочу, чтобы мой UICollectionViewCells имел закругленные углы и тени, но я столкнулся с проблемой, когда кажется, что у меня есть только один или другой, но не оба.

Чтобы обойти углы, я использую этот код при инициализации ячейки:

CALayer *layer = [self layer];
[layer setCornerRadius:4];
[layer setRasterizationScale:[[UIScreen mainScreen] scale]];
[layer setShouldRasterize:YES];

Чтобы просто добавить тень, я использую этот код при инициализации ячейки:

CALayer *layer = [self layer];
[layer setMasksToBounds:NO];
[layer setRasterizationScale:[[UIScreen mainScreen] scale]];
[layer setShouldRasterize:YES];
[layer setShadowColor:[[UIColor blackColor] CGColor]];
[layer setShadowOffset:CGSizeMake(0.0f,0.5f)];
[layer setShadowRadius:8.0f];
[layer setShadowOpacity:0.2f];
[layer setShadowPath:[[UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:layer.cornerRadius] CGPath]];

Чтобы попытаться иметь закругленные углы и тень, я использую этот код при инициализации ячейки:

CALayer *layer = [self layer];
[layer setMasksToBounds:NO];
[layer setCornerRadius:4];
[layer setRasterizationScale:[[UIScreen mainScreen] scale]];
[layer setShouldRasterize:YES];
[layer setShadowColor:[[UIColor blackColor] CGColor]];
[layer setShadowOffset:CGSizeMake(0.0f,0.5f)];
[layer setShadowRadius:8.0f];
[layer setShadowOpacity:0.2f];
[layer setShadowPath:[[UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:layer.cornerRadius] CGPath]];

но это приводит только к теневой тени.

Является ли это ошибкой или я делаю что-то неправильно?

Ответ 1

Работает для меня отлично:

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
    {
        ...
        cell.layer.masksToBounds = YES;
        cell.layer.cornerRadius = 6;
        ...
        return cell;
    }

Ответ 2

Если вы разместите все свои подзоны в представлении контента UICollectionViewCell, которое вы, вероятно, имеете, вы можете установить тень на уровне ячейки и границе слоя contentView для достижения обоих результатов.

cell.contentView.layer.cornerRadius = 2.0f;
cell.contentView.layer.borderWidth = 1.0f;
cell.contentView.layer.borderColor = [UIColor clearColor].CGColor;
cell.contentView.layer.masksToBounds = YES;

cell.layer.shadowColor = [UIColor lightGrayColor].CGColor;
cell.layer.shadowOffset = CGSizeMake(0, 2.0f);
cell.layer.shadowRadius = 2.0f;
cell.layer.shadowOpacity = 1.0f;
cell.layer.masksToBounds = NO;
cell.layer.shadowPath = [UIBezierPath bezierPathWithRoundedRect:cell.bounds cornerRadius:cell.contentView.layer.cornerRadius].CGPath;

Swift 4.0

cell.contentView.layer.cornerRadius = 2.0
cell.contentView.layer.borderWidth = 1.0
cell.contentView.layer.borderColor = UIColor.clear.cgColor
cell.contentView.layer.masksToBounds = true
cell.layer.shadowColor = UIColor.lightGray.cgColor
cell.layer.shadowOffset = CGSize(width: 0, height: 2.0)
cell.layer.shadowRadius = 2.0
cell.layer.shadowOpacity = 1.0
cell.layer.masksToBounds = false
cell.layer.shadowPath = UIBezierPath(roundedRect: cell.bounds, cornerRadius: cell.contentView.layer.cornerRadius).cgPath

Ответ 3

Я думаю, что столкнулся с подобной проблемой. Моя проблема заключалась в том, что обрезка в моих подзонах UICollectionViewCell не работала должным образом с тенями и закругленными границами. Тот же самый код работал очень хорошо, прежде чем я получил это представление (в качестве стандартного подкласса UIView, хотя) в UIScrollView.

Короче говоря, я переместил всю эту настройку с initWithCoder на более позднее место после получения ее из -dequeueReusableCellWithReuseIdentifier:forIndexPath:. Решил проблему для меня. Похоже, что UICollectionViews делают что-то, чего я не ожидал бы от слоев своих ячеек в какой-то момент?

Ответ 4

Есть хитрый момент. Режущие углы и отбрасывающая тень являются взаимоисключающей функцией в одном слое. Отбрасывание тени - это процесс расширения кадра, но углы - это процесс маскирования границ.

Решение находится в разделении функций. Я рекомендую настроить тень для слоя ячейки, но разрезать углы для слоя contentView этой ячейки.

Ответ 5

Если вы используете подкласс, чтобы сделать сборку, убедитесь, что вы выполняете следующее.

CALayer *layer = [self layer];
[layer setCornerRadius:_cornerRadius];
[layer setRasterizationScale:[[UIScreen mainScreen] scale]];
[layer setShouldRasterize:YES];
[layer setShadowColor:[[UIColor blackColor] CGColor]];
[layer setShadowOffset:CGSizeMake(0.0,4.0)];
[layer setShadowRadius:6.0f];
[layer setShadowOpacity:0.25];
[layer setShadowPath:[[UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:layer.cornerRadius] CGPath]];

self.contentView.layer.cornerRadius = _cornerRadius;
self.contentView.layer.borderWidth= _borderWidth;
self.contentView.layer.borderColor = _borderColor.CGColor;
self.contentView.backgroundColor = [UIColor whiteColor];
self.backgroundColor = [UIColor clearColor];

работает как шарм.