2016-01-20 2 views
0

Когда я пытаюсь установить view.layer.backgroundColor, цвет сразу меняется без анимации. Но если я создаю CALayer, добавьте его как подуровень view.layer и измените backgroundColor этого CALayer, я вижу неявную анимацию изменения цвета. Может ли кто-нибудь объяснить, почему нет анимации при изменении view.layer.backgroundColor?Почему view.layer.backgroundColor = randomColor не будет анимировать изменение цвета?

\\ add CALayer 
self.colorLayer = [CALayer layer]; 
self.colorLayer.frame = CGRectMake(50.0f, 50.0f, 100.0f, 100.0f); 
self.colorLayer.backgroundColor = [UIColor blueColor].CGColor; 
[self.view.layer addSublayer:self.colorLayer]; 

\\change the color somewhere else 
CGFloat red = arc4random()/(CGFloat)INT_MAX; 
CGFloat green = arc4random()/(CGFloat)INT_MAX; 
CGFloat blue = arc4random()/(CGFloat)INT_MAX; 
self.colorLayer.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0].CGColor; // can animate 
self.view.layer.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0].CGColor; // won't animate 
+0

может у показать код, как у создания CALayer и chnage цвет фона? –

+0

отредактировал, спасибо! @ Mr.T – bunnyshell

+0

Вы на самом деле не говорите об этом, чтобы оживить. Вы просто меняете его. – Fogmeister

ответ

3

От Core Animation Programming Guide:

Поскольку взгляды IOS всегда имеют базовый слой, сам UIView класс получает большую часть своих данных из объекта слоя непосредственно. В результате изменения, которые вы делаете на слой, автоматически отражаются также объектом представления. Это означает, что вы можете использовать интерфейсы Core Animation или UIView для внесения изменений.

Если вы хотите использовать классы Core Animation для инициализации анимации, вы должны выдать все ваши вызовы Core Animation изнутри блока анимации на основе представления. Класс UIView отключает анимацию слоев по умолчанию, но восстанавливает их внутри блоков анимации. Таким образом, любые изменения, которые вы делаете вне блока анимации, не анимируются.

(Выделено.)

+0

Очевидно, мне нужно принимать больше амфетаминов, если я хочу типа так же быстро, как и вы! :) – matt

+0

Скопируйте 'n' пасту для победы! –

2

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

+0

Для того, что лежит в нижнем слое, см .: http://www.apeth.com/iOSBook/ch16.html#_view_and_layer – matt

+0

Для неявной анимации слоя см .: http://www.apeth.com/iOSBook/ch17.html #_implicit_layer_animation И обратите внимание на примечание: «Вы не можете использовать неявную анимацию на нижнем уровне UIView. Вы можете анимировать базовый слой UIView напрямую, но вы должны использовать явную анимацию слоя» – matt