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];
работает как шарм.