2014-01-16 2 views
1

У меня есть UIView, который летает сверху, когда я открываю этот контроллер. Я установил Y побуждению UIView -200 и когда вид нагрузки, ниже называется и все работает отлично:Проблема с UIView Auto Layout Animation

- (void)updateViewConstraints 
{ 
    [super updateViewConstraints]; 
    self.popUpViewYConstraint.constant = 37.0f; 
    self.closeButtonYConstraint.constant = 28.0f; 
    [self.popUpBaseView setNeedsUpdateConstraints]; 
    [self.closeButton setNeedsUpdateConstraints]; 

    [UIView animateWithDuration:0.25f animations:^{ 
     [self.popUpBaseView layoutIfNeeded]; 
     [self.closeButton layoutIfNeeded]; 
     [self.view layoutIfNeeded]; 
    }]; 
} 

Но теперь у меня есть кнопка закрытия, которая должна оживить UIView назад к -200, а затем удалите контроллер экрана с экрана. Но эта анимация не состоится. Контроллер вида удаляется напрямую. Вот что я делаю:

- (IBAction)closePressed:(id)sender 
{ 
    NSMutableArray *navigationArray = [[NSMutableArray alloc] initWithArray: self.navigationController.viewControllers]; 
    self.navigationController.viewControllers = navigationArray; 

    [UIView animateWithDuration:2.0f animations:^{ 
     self.popUpViewYConstraint.constant = -200.0f; 
     [self.popUpBaseView layoutIfNeeded]; 
    } completion:^(BOOL finished){ 
     [navigationArray removeObjectAtIndex: 1]; 
     [self.baseView removeFromSuperview]; 
     [self.view removeFromSuperview]; 
    }]; 
} 

я упомянул this ссылку. Кажется, он работает для них, но не работает для меня. Пожалуйста, помогите.

+0

Что произойдет, если вы удалите код, который удаляет точку зрения? (т. е. просто сделать блок завершения пустым). Кроме того, попробуйте это ... 'animateWithDuration: delay: options: animations: completion' вместо того, который вы используете с опциями ... UIViewAnimationOptionBeginFromCurrentState – Fogmeister

+0

Ничего не происходит. View Controller просто удален без анимации. – Anil

+0

Можете ли вы поставить снимок экрана до и после анимации, отображающей представление. – Fogmeister

ответ

0

Эта линия:

self.popUpViewYConstraint.constant = -200.0f; 

Должна вызываться перед блоком анимации. Также я не уверен в иерархии ваших представлений, но убедитесь, что вы вызываете правильный вид с помощью вызова layoutIfNeeded.

+0

Пробовал делать это. Нет разницы. Все еще не работает. И что касается иерархии представлений. У меня есть self.view, затем self.baseView, а затем self.popUpBaseView. – Anil

+0

Да, вы можете называть это либо внутри, либо перед блоком анимации. Это не изменит ситуацию. – Fogmeister

+0

@Fogmeister есть ли что-нибудь еще, что я могу сделать, чтобы создать эту анимацию? – Anil

0

Как об этом

- (IBAction)closePressed:(id)sender 
{ 
    NSMutableArray *navigationArray = [[NSMutableArray alloc]:initWithArray:self.navigationController.viewControllers]; 
    self.navigationController.viewControllers = navigationArray; 

    // I am sure the constant should be set outside the animation block. It won't happen until next run loop, which will be inside the block. 
    self.popUpViewYConstraint.constant = -200.0f; 
    // setNeedsUpdateConstraints should be called on the view to which the constraint is added, not the view affected by the constraint. 
    [self.baseView setNeedsUpdateConstraints]; 

    [UIView animateWithDuration:2.0f animations:^{ 
     // I think this should be topmost view 
     [self.view layoutIfNeeded]; 
    } completion:^(BOOL finished){ 
     [navigationArray removeObjectAtIndex: 1]; 
     [self.baseView removeFromSuperview]; 
     [self.view removeFromSuperview]; 
    }]; 
} 
+0

Я думаю, что у меня есть ограничение, которое не позволяет этой анимации. Подумайте, это то, что мешает этому. – Anil

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