2016-12-08 1 views
1

私の目標は簡単で、私はこれを以前に達成したので、ここで私の質問に頼っています。UIView animateWithDuration durationを無視します

私はサブビューをアニメーション化しようとしています。十分に簡単です。ビューは、アニメーションが終了した後の位置に正確に終わります。唯一の問題は: 私はアニメーションの時間を何でも完全に無視されます。それは即座に起こります。

- (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]; 
    } 
} 

そして、その方法自体は、通知によってトリガーされます。

私が完全に理解していない2つのコントローラ間の移行中に、いくつかのことが起こっていることを認めなければなりません。 (そして、私はそれらをよく理解したいと思っています...)

答えて

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

答えBatuhanありがとう。残念ながら私はまだ同じ問題が発生しています。私はframe.origin.xをframe.sizeに設定しようとしました。width/2を設定し、[view removeFromSuperview]をコメントアウトしてクロージャが呼び出されているが、ビューがまだ瞬時に移動することを確認します。これは本当にミステリーになっています。 –

+0

Sory私のせいで、animateWithDurationブロックの前にlayoutIfNeededを使ってみてください。 –

+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]; 
} 
関連する問題