2013-03-20 2 views
3

Я искал вокруг SO и нашел некоторые связанные сообщения, но ни один из них, который (пока) не решил мою проблему.Просмотр не анимированный с помощью Autolayout

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

- (void)animateStarBackground:(NSString *)animationID 
       finished:(NSNumber *)finished 
        context:(void *)context 
        myView:(UIView *)myView 
        xPos:(float)xPos 
        yPos:(float)yPos { 

    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.2]; 
    [UIView setAnimationDelay:0.5]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
    [UIView setAnimationDelegate:self]; 

    myView.center = CGPointMake(xPos, yPos); 

[UIView commitAnimations]; 

}

Он используется для работы большой, но все равно ... все мы знаем, что это не работает в Autolayout больше. Таким образом, я изменил его на следующее:

-(void)animateButton:(UIView *)myView { 

    [UIView animateWithDuration:8.0f animations:^{ 
     _viewConstA.constant = 45.0; 
     [myView layoutIfNeeded]; 
    }]; 

}

Когда происходит действие, вместо того чтобы начинать в это начальное положение, как указано в раскадровке, она начинается как вид 1x1 пикселей в верхнем левом углу угол и анимировать вниз в место последнего отдыха (вместо того, чтобы двигаться на 15 пикселей, как я и предполагал).

Теперь, если я вытащил [myView layoutIfNeeded];, действие позиционирует вид в нужном месте ... НО оно не оживляет. Это сразу появляется, когда появляется представление.

Первый захват экрана - это начальное местоположение. 2-й захват - это то, что должно было быть местом окончательного отдыха. Третий - это оживление с неправильного места и направления.

Мысли/комментарии? Какого черта я делаю неправильно? Я думал, что это будет так просто ... Я должен упустить что-то очевидное.

enter image description here

enter image description here

enter image description here

+0

Я вижу, что когда я делаю это в 'viewDidLoad', но работает правильно, когда я откладываю на' viewDidAppear'. – Rob

+0

Подождите. поэтому вы говорите, когда ставите [self animateButton: myView]; в вашем viewDidAppear, это НЕ анимация из 1x1 пикселей в верхнем левом углу? Huh ... это происходит для меня независимо от того, в каком месте я его загружаю. Я склонен просто делать две разные раскадровки - одну для iPhone 5 и одну для всего остального, и просто продолжаю использовать свой оригинальный код. Фу, это расстраивает. – Drew

+0

Да, это мой опыт. Я просто проверил его, чтобы убедиться, что я не теряю рассудок и подтвердил это.Нижняя строка, выполняющая блочную анимацию ограничений (включая вызов 'layoutIfNeeded') в' viewDidAppear' (или позже), отлично подходит для меня, хотя, когда я это делаю в 'viewDidLoad', я вижу поведение, которое вы описываете. – Rob

ответ

6

Когда слово следующего блока на основе анимации из viewDidLoad, он оживляет кадр из CGRectZero к конечному местоположению. Но если я назову это от viewDidAppear, он работает так, как ожидалось.

- (void)animateMovementByConstraint 
{ 
    [UIView animateWithDuration:0.5 
        animations:^{ 
         self.topLayoutConstraint.constant = 100; 
         [self.view layoutIfNeeded]; 
        }]; 
} 

(В этом примере, topLayoutConstraint является IBOutlet, что я определил в Interface Builder для верхнего вертикального ограничения на контроле, что я хотел, чтобы оживить.)

С Автокомпоновкой, так как я начал инициируя мои анимации в viewDidAppear, у меня не было никаких проблем.

+1

Спасибо за ваши комментарии, они определенно помогли в диагнозе. В целом у меня были две проблемы. 1.) Я переехал [self animateButton]; в viewDidAppear INSTEAD of viewWillAppear. 2.) Я снова взял подсказку из вашего кода и изменил [myView layoutIfNeeded]; до [self.view layoutIfNeeded]; Бам - отлично работает! Спасибо за помощь. – Drew