0

1つのviewControllの挿入をアニメーション化する方法を理解しました

[self transitiontoViewController:self.filterController duration:.5 options:UIViewAnimationOptionTransitionNone  animations:^{
[self.filterController.view resizeandMovewithRect:CGRectMake(0, self.filterController.view.frame.size.height, 0, 0)];
} completion:^(BOOL finished){
}];

ここで、resizeAndMovewithRectは、UIViewにこのカテゴリを使用してビューを移動するだけです。

-(void) resizeandMovewithRect:(CGRect)movement
{
    CGRect myFrame = self.frame;

    CGRect newFrame = CGRectMake(myFrame.origin.x+movement.origin.x, myFrame.origin.y + movement.origin.y, myFrame.size.width + movement.size.width , myFrame.size.height + movement.size.height);
    self.frame =newFrame;
}

今、私は反対のことをしたいと思います。self.filterControllerを画面外に移動して閉じてほしい。

そのための1つの方法は次のとおりです。

[self transitiontoViewController:self.filterController duration:.5 options:UIViewAnimationOptionTransitionNone  animations:^{
[self.filterController.view resizeandMovewithRect:CGRectMake(0, -self.filterController.view.frame.size.height, 0, 0)];
} completion:^(BOOL finished){
}];

これを行うと、アニメーションはまったく描画されません。

アニメーションの開始時に、self.filterControllerがスーパービューから削除されているように見えます。そのため、self.filterControllerに何が起こっても表示されません。だから私はこのようにします

   [UIView animateWithDuration:.5 animations:^{
        [self.filterController.view resizeandMovewithRect:CGRectMake(0, -self.filterController.view.frame.size.height, 0, 0)];
    } completion:^(BOOL finished){
        [self transitiontoViewController:self.last2ViewsInTheContainer[0] duration:0 options:UIViewAnimationOptionTransitionNone  animations:^{
        } completion:nil];
    }];

したがって、[self transitiontoViewControllerを呼び出す前に、まずself.filterController.viewをロールアップするアニメーションを作成します。

ただし、このようにすると、self.filterController.viewがロールアップされるまでに、それを置き換えるビューはまだスーパービューに追加されていません。見えないように。

とにかくどうすればいいですか?

4

1 に答える 1

0

私は答えを見つけました。ビューは最後まで削除されません。問題は、新しい viewController がスタックの一番上に追加されることです。

したがって、self.filterController を追加する場合は簡単です。からのビューが後ろにある間、それはすでに前にあります。

self.filterController を引き出すと、その backView が前面にあり、self.filterController を隠しています。したがって、解決策は、単純に self.filterController をスーパービューに readd することであり、アニメーションが表示されます。

最終的なコード:

[self transitiontoViewController:self.last2ViewsInTheContainer[0] duration:.5 options:UIViewAnimationOptionTransitionNone  animations:^{
    [self.filterController.view.superview addSubview:self.filterController.view]; //Put the filterControllerView at the front
    [self.filterController.view resizeandMovewithRect:CGRectMake(0, -self.filterController.view.frame.size.height, 0, 0)];
} completion:nil];
于 2012-10-30T09:26:37.243 に答える