2016-12-08 5 views
1

Моя цель проста, и я достиг этого ранее, поэтому я прибегаю к заданию своего вопроса здесь.UIView animateWithDuration игнорирует длительность

Я пытаюсь анимировать подзаголовок. Достаточно просто. Вид заканчивается именно там, где я хочу, чтобы он был после завершения анимации. Единственная проблема: независимо от того, что я делаю, продолжительность анимации полностью игнорируется. Это происходит мгновенно.

- (void)callToDismissView:(UIView *)view { 

    [self.view addSubview:view]; 

    [self dismissViewControllerAnimated:NO completion:nil]; 

    [UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^(void){ 

     CGRect frame = self.view.frame; 
     frame.origin.x = frame.size.width; 
     view.frame = frame; 

    } completion:^(BOOL finished){ 

     [view removeFromSuperview]; 
    }]; 
} 

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

EDIT:

Приведенный выше код вызывается делегатом в уволенного контроллере представления следующим образом:

- (void)dismissSelf { 

    if (self.delegate && [self.delegate respondsToSelector:@selector(callToDismissScan)]) { 

     [self.delegate callToDismissScan]; 
    } 
} 

И что сам метод вызывается путем уведомления ,

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

ответ

0

Возможно, вам нужно попробовать вот так.

- (void)callToDismissView:(UIView *)view { 
    [self.view addSubview:view]; 
    CGRect frame = self.view.frame; 
    frame.origin.x = frame.size.width; 
    [UIView animateWithDuration:0.3 delay:0.3 
         options:UIViewAnimationOptionCurveEaseInOut animations:^(void){ 
          view.frame = frame; 
         } 
        completion:^(BOOL finished){ 
          [view removeFromSuperview]; 
          //[self dismissViewControllerAnimated:NO completion:nil];//uncomment if need. 
        }]; 
} 
+0

По-прежнему воспроизводит ту же проблему. –

+0

Закрытие анимации вызывает, но продолжительность всегда игнорируется. –

+0

Проверить представление параметра nil или нет. Происхождение нового кадра было установлено как self.view.frame.size.width, вы не можете увидеть результаты анимации. – John

1

Вы можете попробовать [self.view layoutIfNeeded];

как этот

- (void)callToDismissView:(UIView *)view { 

[self.view addSubview:view]; 

[self dismissViewControllerAnimated:NO completion:nil]; 
[self.view layoutIfNeeded]; 
[UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^(void){ 

    CGRect frame = self.view.frame; 
    frame.origin.x = frame.size.width; 
    view.frame = frame; 
    [self.view layoutIfNeeded]; 

} completion:^(BOOL finished){ 

    [view removeFromSuperview]; 
}]; 
} 
+0

Спасибо за ответ Батухана. К сожалению, я все еще испытываю такую ​​же проблему. Я попытался установить frame.origin.x в frame.size.width/2 и закомментируйте [view removeFromSuperview], чтобы убедиться, что вызов был вызван, но представление все равно перемещается мгновенно. Это действительно становится мистерией. –

+0

Sory моя ошибка, попробуйте использовать layoutIfNeeded также перед блоком animateWithDuration –

+0

Не беспокойтесь. Я попробовал это, как только увидел ваш ответ. К сожалению, это не работает. –

0

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

- (void)dismissSelf { 

    UIView *dummyView = [ScreenCapper captureScreenIn: self]; 
    UIViewController *presentingViewController = (UIViewController *)self.delegate; 
    [self.view.window addSubview: presentingViewController.view]; 
    [self.view.window addSubview: dummyView]; 

    [UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^(void){ 

     dummyView.frame = CGRectMake(dummyView.frame.size.width, dummyView.frame.origin.y, dummyView.frame.size.width, dummyView.frame.size.height); 

    } completion:^(BOOL finished){ 
     if (self.delegate && [self.delegate respondsToSelector:@selector(callToDismissView)]) { 

      [self.delegate callToDismissView]; 
     } 
    }]; 
} 

И в контроллере представления, чтобы представить все, что осталось сделать, чтобы отклонить представленный контроллер представления без анимации.

- (void)callToDismissView { 

    [self dismissViewControllerAnimated:NO completion:nil]; 
} 
Смежные вопросы