CAGradientLayer отправить обратно

У меня есть UIViewController где я создаю фоновый градиент с

    CAGradientLayer *gradient = [CAGradientLayer layer];
    ...
    gradient.frame = frame;
    self.backGradient = gradient;
    [self.view.layer insertSublayer:gradient atIndex:0];

все отлично работает, позже я должен отправить подпредставление _selectionFrame моего контроллера вид сзади:
(Мне часто нужно отправить _selectionFrame назад и вперед, для анимации и рисования)

self это viewController:

[self.view sendSubviewToBack:_selectionFrame]; 

Однако это отправляет _selectionFrame за gradient, Я хочу это чуть выше градиента, но ниже любого другого подпредставления. Проблема в том, что градиент не является представлением, поэтому я не могу использовать функции для градиента.
Я хотел бы позвонить [self.view sendSubviewToBack:gradient];

Но это не работает.

3 ответа

Решение

Создайте вид, который содержит только градиент

.layer имеет свойство sublayers, которое представляет собой простой массив. Таким образом, вы можете вставить в любой индекс, который вы хотите. Если вы хотите, чтобы ваш новый слой находился сзади, просто вставьте его в 0, вот так:

let newLayer = CALayer() // your layer that you want at the back
view.layer.insertSublayer(newLayer, at: 0)

Самое простое решение - не вставлять градиентный слой как подслой self.view.layer, Вместо этого должно быть self.view.layer, У подкласса UIView есть метод класса layerClass это позволяет вам сказать, каким классом должен быть его слой.

Или это может быть слой какого-то другого подпредставления self.viewснова легко упорядочить с помощью того же метода класса layerClass,

В противном случае вам придется использовать команды слоя, а не команды просмотра, чтобы упорядочить подслои self.view, Это включает его подпредставления. Другими словами, если v это подвид self.view, затем v.layer подслой self.view.layer и вы можете упорядочить его среди подслоев, переставив массив подслоев.

Другие вопросы по тегам