2009-04-30 4 views
2

Я создал новое приложение на основе View в XCode.CATransaction Без анимации

В ViewController, единственный код, который я модифицировал выглядит следующим образом:

- (void)viewDidLoad { 
[super viewDidLoad]; 

UIView *newView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]; 
newView.backgroundColor = [UIColor redColor]; 
[self.view addSubview:newView]; 


[CATransaction begin]; 
[CATransaction setValue:[NSNumber numberWithFloat:0.5f] forKey:kCATransactionAnimationDuration]; 

newView.layer.frame = CGRectMake(20,20,220,220); 

[CATransaction commit]; 
} 

Он должен создать красный квадрат, который оживляет на полсекунды, как только загрузки приложения. Проблема в том, что она не оживляет. Я не могу понять, почему. Я создал этот простой проект, чтобы изолировать все переменные, и все же он все еще не работает.

Может кто-нибудь помочь или указать мне в правильном направлении некоторые материалы для чтения Core-Animation. Я уже прошел через все материалы Apple.

ответ

5

Ваш код будет анимировать, как и ожидалось, если вы устанавливаете свойства на CALayer (они ожидают по умолчанию). Для UIViews анимировать, вы должны изменить свои свойства в пределах блока, как следующее:

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:1.0f]; 

// Change properties here 

[UIView commitAnimations]; 

CATransactions используется для группирования анимации, так что они координируются, или вручную отключить анимацию для группы объектов.

+1

Разве это не то, что строка «newView.layer.frame = CGRectMake (20,20,220,220);» делает? Свойство «layer» обращается к CALayer UIView. Это должно анимировать его, правильно? – mazniak

+0

Вы правы, я неправильно понял эту строку. В этом случае то, что вы делаете, должно оживить. Это немного чище использовать блок UIView begin/commit, но он должен работать одинаково. –

+2

Я думаю, что может случиться так, что цикл запуска не заканчивается после добавления нового подвью, но перед запуском анимации. Поэтому он просто помещает представление в свою конечную позицию. Попробуйте переместить код анимации в отдельный метод и запустить этот метод с помощью функции performSelector: withObject: afterDelay: с задержкой 0,01 с. Это должно позволить анимации активироваться после добавления subview. –

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