2015-06-01 1 views
6

У меня есть UITableViewCell с UIView. я сделал некоторые CABasicAnimation и прикрепить его к новому CAShapeLayer, затем добавить этот слой на мой супер слой в моей UITableViewCell:Swift: удалить слой, не удаляя UIView в UITableViewCell

self.layer.addSublayer(myLayer!) 

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

достичь этого, добавив мой UIView слой таким же образом:

self.layer.addSublayer(myViewLayer!) 

В этом случае, мой UIView слой был на вершине CAShapeLayer с анимацией.

Но у меня есть проблема, мне нужно удалить слой UIView - myViewLayer, потому что он нарушает ширину UIView при прокрутке.

Когда анимация завершена, и мне нужно удалить слои, я могу удалить CAShapeLayer - myLayer без проблем.

myLayer?.removeFromSuperlayer() 

Но когда я пытаюсь сделать то же самое с myViewLayer, мой UIView удален тоже. Но я не хочу этого, мне нужен мой UIView на экране и в моей иерархии.

Я не понимаю, почему, если взглянуть на self.layer.sublayers я вижу это (перед добавлением слоев):

[<CALayer: 0x7fd1f0d4fe40>, <CALayer: 0x7fd1f0ddc950>] 

И после того, как анимация сделано и myLayer удаляется:

[<CALayer: 0x7fd1f0d4fe40>, <CALayer: 0x7fd1f0ddc950>, <CAGradientLayer: 0x7fd1f0de3660>] 

Как вы можете см. CAGradientLayer - это слой моего UIView. Итак, я не сделал этого, прежде чем вручную добавить его в массив подслоев. Как я могу удалить его, не удаляя мой UIView?

ИЛИ как я могу добавить myLayer под UIView?

EDIT

В нескольких словах у меня есть эта иерархия слоя перед тем анимации:

[<CALayer: 0x7fd1f0d4fe40> <- (I think this is UITableViewCell layer), <CALayer: 0x7fd1f0ddc950> <- (then, this is UITableViewCell content view layer)] 

В то же время, у меня есть вид иерархии:

UITableViewCell -> Content View - > UIView

Мне нужно добавить новый слой с анимацией, ниже UIView (я хочу, чтобы UIView частично cove r что новый слой с анимацией). Как я могу это сделать?

У меня нет слоя UIView в иерархии уровней UITableView, поэтому я не могу просто добавить слой с анимацией, используя addLayer:below: и так далее.

ответ

4

Я нашел проблему. Я сделал простую ошибку. Я использовал self.layer.sublayers, но я должен использовать self.contentView.layer.sublayers, это моя ошибка.

Когда я обнаружил это, я смог исправить другие проблемы и использовать addLayer:below:.

Итак, если вы не видите слой, который должен находиться в подуровне вашего объекта, это означает, что вы смотрите в неправильном месте, подумайте, где он может быть, и вы его найдете, например, в UITableView вам нужно работать с contentView.

3

Вы можете добавить myLayer ниже UIView.layer установкой

myLayer.zPosition = -1

+0

, как вы можете видеть, 'self.layer.sublayers' есть не' UIView.layer' в самом начале, но если я добавьте его, у меня все остальное. –

+0

На iOS каждый UIView имеет слой. Итак, self.view.layer - это слой вашего объекта вида. Первоначально у него не будет подслоев. –

+0

да, вы правы, у него нет слоев, но у этого self.view есть subview (мой UIView - у меня есть слой myViewLayer). И я упоминаю об этом еще раз, этот слой UIView не нашел в self.view.layer.sublayers. –

1

Приведенный ниже пример может также устранить вашу проблему.

Первое решение:

self.avPlayerLayer.zPosition = 0 // or -1 
self.view.layer.addSublayer(self.avPlayerLayer) 

Или второе решение

self.view.layer.insertSublayer(self.avPlayerLayer, below: self.button1.layer) 
+0

спасибо за ваш ответ, но, как я сказал, проблема была в неправильном« корневом »слое. Я забыл о слое contentView и просто использовал self.view.layer. Я хотел удалить этот вопрос, но уже есть 2 ответа (без моего собственного), поэтому я оставил его на случай, если кто-то столкнется с такой же проблемой. В любом случае, спасибо. –