CAShapeLayer замедляет вращение интерфейса

Я пытаюсь переместить некоторый пользовательский код рисования из вида в CAShapeLayer, который затем добавляется в качестве подслоя к исходному виду CALayer. Это тоже хорошо работает, но при вращении устройства анимация начинает заикаться, т.е. вы просто видите кадр в исходной ориентации, а затем окончательную ориентацию, максимум с одним кадром между ними - совсем не гладко. Анимации выдвижения и выдвижения соответствующих UIViewController тоже немного дергаются (но не настолько).

Все, что CAShapeLayer имеет в своем path, это один CGPathAddRect, он установлен как opaque, его opacity равен 1.0f, а fillColor установлен как непрозрачный синий.

Однако при рисовании пути непосредственно в методе представлений drawRect анимация выполняется плавно. Так что я предполагаю, что это как-то связано с анимацией CAShapeLayer во время вращения.

Не могли бы вы сказать мне, как избавиться от этих рывков или просто скрыть CAShapeLayer при анимации? Возврат к простому рисованию CGPaths напрямую для меня не вариант, потому что я полагаюсь на способность CAShapeLayer анимировать свой путь (в моих попытках он не анимируется с вращением вида).

/update: это также происходит, когда вращающееся представление UIViewControllers содержит представление с подклассом CAGradientLayer в качестве его layerClass (например, представление с градиентным слоем в качестве фона).

Ваше здоровье

Мистер Маг


person MrMage    schedule 09.01.2010    source источник


Ответы (2)


Ну, есть свойство скрытия, вы можете скрыть CAShapeLayer, а затем выполнить анимацию. Затем вызовите метод, который скрывает CAShapeLayer, чтобы вы не видели его во время вращения, и тогда он должен быть гладким.

person Jab    schedule 12.01.2010
comment
Я пробовал это. Это не работает. Не помогает даже полное удаление CAShapeLayer из - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration, а затем повторное добавление его в - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation. - person MrMage; 12.01.2010
comment
Ну, вы могли бы выделить его и выделить, а также сохранить? попробуй, может быть. Кстати, дайте мне некоторую свободу действий, я не силен в iPhone или даже в этом кодировании. просто посмотрите на мой профиль и увидеть вопросы. У меня действительно очень мало опыта за плечами. Мне всего 17. Извините за отсутствие помощи с моей стороны - person Jab; 15.01.2010
comment
Вы действительно уверены, что проблема даже в слое? - person Jab; 15.01.2010
comment
Ну, если слой (либо простой CAGradientLayer, либо CAShapeLayer) добавлен в вид, он заикается. Если я его не добавлю, он не будет заикаться. Возможно, я попытаюсь освободить, кэшировать и перераспределить слой, но это очень неэлегантно, и я сомневаюсь, что это поможет. - person MrMage; 17.01.2010
comment
Что ж, если бы вы могли использовать инструменты, тогда я бы это сделал, тогда вы могли бы увидеть, где проблема. - person Jab; 17.01.2010

Похоже, эта проблема была исправлена ​​Apple в iOS 4.

person MrMage    schedule 22.09.2010