CAGradientLayer не работает на iOS 7 (но работает на iOS 6)

Я использую следующий код, чтобы добавить эффект градиента субтитров в ячейку таблицы.

// add a layer that overlays the cell adding a subtle gradient effect CAGradientLayer* gradientLayer = [CAGradientLayer layer]; NSLog(@"%@",NSStringFromCGRect(cell.bounds)); gradientLayer.frame = cell.bounds; gradientLayer.colors = @[(id)[[UIColor colorWithWhite:1.0f alpha:0.2f] CGColor], (id)[[UIColor colorWithWhite:1.0f alpha:0.1f] CGColor], (id)[[UIColor clearColor] CGColor], (id)[[UIColor colorWithWhite:0.0f alpha:0.1f] CGColor]]; gradientLayer.locations = @[@0.00f, @0.01f, @0.95f, @1.00f]; [cell.layer insertSublayer:gradientLayer atIndex:0]; 

После запуска кода я вижу, что CAGradientLayer был добавлен в мой cell.layer. Но я не вижу его вообще, когда запускаю приложение на своем iOS 7 Simulator.

 <CALayer:0xaca1980; sublayers = (<CAGradientLayer: 0xaad2110>, <CALayer: 0xaca2a70>); 

Код работает на iOS 6 без каких-либо проблем.

Если CAGradientLayer больше не работает на iOS 7, что я могу сделать, чтобы добавить градиенты в ячейку таблицы?

Заранее спасибо.

Я исправил это, установив цвет фона ячейки. В этом случае вы могли бы поддерживать индекс как 0, поэтому элементы отображаются, а также отображается градиент.

 cell.backgroundColor = [UIColor clearcolor]; [cell.layer insertSublayer:gradientLayer atIndex:0]; 

Согласно моему комментарию выше, мне немного туманно, почему это работает. Кажется, что после нескольких тестов на iOS6 у меня есть 2 подслоя, где для iOS7 у меня 1. Что это связано с введением индексов вне меня. Я не понимаю, почему установка градиента в индекс 1 работает … doh! 🙂

Но для моих нужд я требовал, чтобы градиент появлялся над всем остальным, поэтому вместо того, чтобы использовать ответ выше с проверками ОС (который отлично работает BTW !!), я сделал что-то вроде:

 [self.layer insertSublayer:_gradientLayer above:[self.layer.sublayers firstObject]]; 

Я исправил эту проблему, изменив

 [cell.layer insertSublayer:gradientLayer atIndex:0]; 

в

 [cell.layer insertSublayer:gradientLayer atIndex:1]; 

Для обратной совместимости. Я использую код, подобный этому

  if ([Common isiOS7]) { [self.layer insertSublayer:_gradientLayer atIndex:1]; } else { [self.layer insertSublayer:_gradientLayer atIndex:0]; } 

Обновление апреля 2016 года

Поэтому я наткнулся на этот вопрос, поскольку у меня возникла аналогичная проблема. Для меня следующий чудесным образом сделал трюк:

вместо использования gradient.colors = @[*colors*] , мне пришлось использовать gradient.colors = [NSArray arrayWithObjects: *colors*, nil]

Может быть ошибка Apple, или что-то, чего я не понимаю. Надеюсь, это поможет кому угодно!

  • Рисование UIImage в CALayer.contents не отображает данные изображения
  • CALayer & drawRect
  • iOS - Как удалить ранее добавленные подуровни UIView
  • Как сделать другой цвет, когда цвет слоя меняется
  • Обтравочные тени, созданные CALayer.shadow
  • Добавить текст в CALayer: drawInRect не работает
  • Анимация маскированного UIView, CALayer
  • Как вычислить ограничительную рамку строки CATextLayer?
  • Сглаживание основных графических кривых
  • Иерархия CALayer, Лучший способ привлечь ее к контексту точно так, как показано на экране
  • Анимация Свойство videoGravity AVPlayerLayer
  • Давайте будем гением компьютера.