Итак, моя цель - сделать своего рода анимацию раздвижных дверей в ответ на жест скольжения. Вы можете увидеть GIF моей текущей анимации here (игнорируйте тот факт, что жест ведет себя противоположно тому, что вы ожидаете).CALayers: A) Могу ли я рисовать непосредственно на них и B) Как сделать настройку ширины на суперслое влиять на подуровень
Вот как я сейчас это делаю: у меня есть подкласс UIView Я звоню в DoorView. DoorView имеет три CALayers: базовый суперслой, который поставляется с каждым UIView; подслой под названием doorLayer, который является белым прямоугольником, который скользит; и еще один подслой, называемый frameLayer, который является «дверной рамкой» (черная рамка вокруг doorLayer). У DoorLayer и frameLayer есть свои отдельные анимации, которые запускаются последовательно.
Вот что мне нужно добавить в DoorView: простой прямоугольник, представляющий ручку двери. На данный момент я не планирую давать ручке свою собственную анимацию. Вместо этого я хочу, чтобы это просто было «привязано» к дверному слою, чтобы оно анимировалось вместе с любыми анимациями, применяемыми к doorLayer.
Вот где мой первый вопрос: я знаю, что я могу добавить еще один слой (назовем его handleLayer) и добавить его в качестве подуровня в doorLayer. Но есть ли способ просто «нарисовать» маленький прямоугольник на дверном слое, не требуя дополнительного слоя? И если да, то это предпочтительнее по любой причине?
Теперь для моего второго вопроса: поэтому на данный момент я фактически использую отдельный слой, называемый handleLayer, который добавляется в качестве подуровня в doorLayer. Вы можете увидеть GIF анимации с помощью handleLayer here.
А вот анимация применяется к doorLayer:
UIView.animateWithDuration(1.0, animations: {() -> Void in
self.doorLayer.frame.origin.x = self.doorLayer.frame.maxX
self.doorLayer.frame.size.width = 0
}
Этой анимация сдвигает начало кадра doorLayer к правой границе дверной пока декременту его ширине, что приводит к появлению двери скольжения в право и исчезает, когда он это делает.
Как вы можете видеть в приведенном выше GIF, сдвиг начала дверного слоя применяется к подуровню handleLayer по желанию. Но настройка ширины не переносится на handleLayer. И это хорошо, потому что я не хочу, чтобы ручка становилась более узкой с той же скоростью, что и дверной слой.
Вместо этого желательно, чтобы handleLayer перемещался с помощью слоя DoorLayer, но сохранял свой размер. Но когда дверной слой исчезает в правой части дверной коробки, ручка исчезает вместе с ним (как бы выглядела с нормальной дверью). Есть ли какие-нибудь подсказки, как лучше всего это сделать?
В настоящее время в анимации моего doorLayer, я добавил эту строку:
if self.doorLayer.frame.size.width <= self.handleLayer.frame.size.width {
self.handleLayer.frame.size.width = 0
}
Но это приводит к this, что не совсем верно.
Спасибо за помощь!
Отлично, большое вам спасибо за подробный ответ! Мне любопытно, должен ли я/должен использовать CATransactions и тому подобное, а не UIView.animateWithDuration. Я полагаю, что главное отличие состоит в том, что вы используете преобразования, а не простые корректировки фреймов/границ. Просто интересно, какие преимущества/потребности. –
Но, конечно же, я попытался настроить иерархию слоев в соответствии с вашими требованиями и установить masksToBounds на базовом уровне, но оставил весь код animateWithDuration в такт. И я не получаю желаемого результата. [GIF здесь] (http://gfycat.com/SmugEasyIndianpangolin). Как вы можете видеть, ручка исчезает в дверной коробке правильно, но затем становится видимой, когда рама расширяется. Хотя я могу просто пропустить что-то глупое. –
Вы уверены, что ваша ручка двери является дочерью скользящего слоя? –