2015-01-13 2 views
3

У меня есть подкласс UICollectionViewCell, и мне нужно обогнуть его углы и добавить тень. Ячейка выглядит как квадратная карта, и ячейки имеют достаточное пространство между ними.Невозможно установить тень на UICollectionViewCell и иметь закругленные углы. Могу только сделать одну работу за один раз

Так что «под каждой» ячейкой я хотел бы добавить тень. Я могу это сделать, но тогда у моей камеры только закругленные углы внизу. У вершины просто нормальные углы. Мне нужны закругленные углы для всех четырех углов.

Я нашел решение здесь для UIViews, которые рекомендуют добавление отдельного UIView как subview, но я бы предпочел, чтобы избежать этого из соображений производительности.

Я нашел одно решение, которое должно было использовать этот метод, который вы найдете в моем коде ниже:

[UIBezierPath bezierPathWithRoundedRect: cornerRadius:]

Но это не работает для меня тоже. Возможно ли, что это не работает для меня из-за того, как я пытаюсь добавить только тень «внизу»/в нижней части ячейки? Похоже, что большинство этих ответов предоставляются для вопросов, по которым разработчик хочет добавить тень вокруг всей ячейки.

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

Я нацеливание iOS 7+ и используя Xcode 6.1.1.

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

- (void)load:(CustomUserObject *)customObject 
{ 
    self.customObject = customObject; 

    // Round cell corners 
    self.layer.cornerRadius = 12; 

    // Add shadow 
    self.layer.masksToBounds = NO; 
    self.layer.shadowOpacity = 0.75f; 
    self.layer.shadowRadius = 10.0f; 
    self.layer.shouldRasterize = NO; 
    self.layer.shadowPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(self.frame.size.width/2 - (self.frame.size.width - 50)/2, self.frame.size.height, self.frame.size.width - 50, 10) cornerRadius:self.layer.cornerRadius].CGPath; 

} 

EDIT: Если я устанавливаю self.layer.masksToBounds - NO, тень работает, но верхние углы не круглые. Если я установил self.layer.masksToBounds в YES, тень не работает, но все четыре угла округлены. Я просто не могу понять, как обогнуть все четыре угла и заставить тень работать.

+0

Есть ли причина, что вы пытаетесь создайте свой собственный «shadowPath» вместо того, чтобы позволить системе отслеживать слой? –

+0

Вы пробовали shadowOffset? – Wain

+0

@IanMacDonald Я только что нашел ответ «SO» ранее о том, как добавить тень, и вот как они это делают. – user3344977

ответ

5

После просмотра примера проекта, который Тимоти Муз был достаточно любезен, чтобы поделиться комментариями, я понял, что я буквально делаю все почти так же, как и он.

Из-за разочарования, я просмотрел файл моей камеры nib, и он, наконец, ударил меня. Я добавил UIView в начало ячейки. Этот вид служил цветным баннером и также функционировал как контейнер для другого UIImageView и UILabel.

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

Глупая ошибка, много раз ее мелочи.

Вот код, который я использую для достижения четырех закругленных углов и тени под UICollectionViewCell.self.banner является дополнительным UIView, что скрывалось клеточные верхние углы:

- (void)load:(CustomUserObject *)customObject 
{ 
    self.customObject = customObject; 

    // Round the banner's corners 
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.banner.bounds 
                byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerTopRight) 
                 cornerRadii:CGSizeMake(10, 10)]; 

    CAShapeLayer *maskLayer = [CAShapeLayer layer]; 
    maskLayer.frame = self.banner.bounds; 
    maskLayer.path = maskPath.CGPath; 
    self.banner.layer.mask = maskLayer; 

    // Round cell corners 
    self.layer.cornerRadius = 10; 

    // Add shadow 
    self.layer.masksToBounds = NO; 
    self.layer.shadowOpacity = 0.75f; 
    self.layer.shadowRadius = 10.0f; 
    self.layer.shouldRasterize = NO; 
    self.layer.shadowPath = [UIBezierPath bezierPathWithRect:CGRectMake(self.frame.size.width/2 - (self.frame.size.width - 50)/2, self.frame.size.height, self.frame.size.width - 50, 10)].CGPath; 

} 
+0

Рад, что вы его исправили. Мой первоначальный комментарий заключался в том, что что-то должно скрывать его :) –

0
func dropShadow() { 
    self.layer.masksToBounds = false 
    self.layer.shadowColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.25).cgColor 
    self.layer.shadowOpacity = 0.5 
    self.layer.shadowOffset = CGSize(width: 0.0, height: 2.0) 
    self.layer.shadowRadius = 4.0 
    self.layer.cornerRadius = 5.0 
} 

// Чтобы удалить тень использовать

cell.dropShadow()

Смежные вопросы