2013-06-25 3 views
2

У меня есть один простой анимации:анимации не показан при вызове его первый раз

- (void)showMenu 
{ 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationDelay:0.0]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 

    self.scrollView.frame = CGRectMake(296, -150, 432, 356); 

    [self.buttonMenu setImage:[UIImage imageNamed:@"menu_arrow_up.png"] forState:UIControlStateNormal]; 
    [self.view bringSubviewToFront:self.scrollView]; 

    [UIView commitAnimations]; 
} 

Когда я называю эту анимацию в первый раз, просто образ моей кнопки меняется, позиция моего Scrollview не меняется ,

Все работает правильно, после того как я дважды позвонил в мой метод showMenu.

  • Я звоню showMenu. изображение кнопки изменяется. позиция scrollview не
  • Я вызываю другой способ сбросить все. изображение кнопки меняется. позиция scrollview не
  • Я звоню showMenu. изображение кнопки изменяется. Положение scrollview изменяет
  • теперь она работает каждый раз, когда я называю showmenu

второй метод closeMenu:

- (void)closeMenu 
{ 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationDelay:0.0]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 

    self.scrollView.frame = CGRectMake(296, -317, 432, 356); 

    [self.buttonMenu setImage:[UIImage imageNamed:@"menu_arrow_down.png"] forState:UIControlStateNormal]; 

    [UIView commitAnimations]; 
} 

Так почему же это работает только тогда, когда я нажимаю его дважды?

+0

Да автомат включен – Mulgard

+0

, но почему он работает после второго использования? без проблем и жаловаться, даже если я перезагружаю ui? – Mulgard

+0

Я бы порекомендовал просто не использовать автоспуск. Это в конечном итоге намного больнее, чем стоит – Ben

ответ

2

У меня была такая же проблема, когда я выполнял UIAnimation и одновременно добавлял UITableView программно. Рамка UIView изменяется, но она не будет отображаться на дисплее. Чтобы решить эту проблему, обратитесь к методу с использованием

BLOCKQUOTE

-performSelector: withObject: afterDelay: с задержкой 0.

Это решит вашу проблему.

0

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

Возможно, вы не видите, что эта проблема проявляется во второй раз, когда вы вызываете эту процедуру, потому что вы, вероятно, ничего не предпринимаете сразу после этого, что заставляет переназначать ограничения. Даже при автозапуске вы можете когда-нибудь изменить frame вручную, и он будет работать, но как только будут перезагружены ограничения, frame может быть сброшен.

Есть два решения:

  1. При использовании автоматической раскладки, вы можете анимировать изменение ограничений констант. См. Последнюю часть this answer для примера того, как создать ограничение IBOutlet для ограничения, а затем изменить свойство constant в блоке анимации.

  2. Вы также можете просто отключить автозапуск.