2016-12-08 42 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]; 
    }]; 
} 

我已經嘗試了不同的框架和持續時間,看看是否有人在所有的動畫,它總是結束了,我需要它。只有瞬間......

編輯:

上面的代碼是被稱爲在被解僱的視圖控制器的委託,像這樣:

- (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

檢查參數視圖是否爲零。新幀的起源已被設置爲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

感謝Batuhan的回答。不幸的是,我仍然遇到同樣的問題。我試圖將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]; 
}