2015-06-22 2 views
1

Мне нужна сложная непрерывная анимация UIView, которая включает в себя настройку поворота и свойств перевода CATransform3D, поэтому стандартная анимация не является вариантом.Как применить сложные изменения трансформации CALayer?

Я обратился к использованию CALayer анимации. И есть это:

self.displayLink = [self.window.screen displayLinkWithTarget:self selector:@selector(update:)]; 
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 

- (void)update:(CADisplayLink*)sender 
{ 
    CGFloat elapsedTime = sender.timestamp - self.lastTimestamp; 
    self.lastTimestamp = sender.timestamp; 

    self.rotation += elapsedTime * 0.1; // Factor determines speed. 

    // This is just example for SO post; the real animation is more complicated! 
    CATransform3D transform; 
    transform = CATransform3DMakeRotation(self.rotation, 1.0, 0.0, 0.0); 
    self.imageLayer.transform = transform; 
} 

self.imageLayer Вот это CALayer которого contents было установлено с изображением и добавил в качестве подслоя к моему базовой точке зрения.

Он вращается «немного», но не постоянно, иногда кажется, что он немного останавливается или поворачивается назад.

Похоже, что назначение нового transform не имеет никакого эффекта, потому что значение self.rotation увеличивается намного больше. Добавление [self setNeedsDisplay] не помогло.

Я еще не много сделал с CALayer s, но я думаю, что я пропустил что-то очень простое. Пытался найти его в течение некоторого времени, но все примеры, которые я нашел, выглядят слишком далеко от того, что я хочу.

+0

@GeneratorOfOne Скорость вращения должна быть анимирована; он должен замедляться со временем. Значит, этот метод правильный? Должен ли я использовать «NSTimer»? –

ответ

4

Когда вы создаете свой собственный слой, а затем изменить его свойства, он одушевляет их неявно (см “Animating Simple Changes to a Layer’s Properties”. Вы не видите изменения, которые вы ожидаете, потому что Core Animation оживляет изменения, а не применять их немедленно.

Вам нужно отключить неявные анимации Есть несколько способов, чтобы отключить его, см “Changing a Layer’s Default Behavior” Или search stack overflow for “disable implicit animations” Вот один из способов:.

NSDictionary *actions = @{ @"transform": [NSNull null] }; 
self.imageLayer.actions = actions; 

Просто сделать это один раз, когда вы создаете imageLayer

...
+0

Это то, о чем я думал в какой-то момент. Но поскольку я не ожидал неявной анимации, я продолжил поиск (зря). Удивительно; большое спасибо! –

Смежные вопросы