1

カスタム セグエを使用して、2 つのビュー コントローラー間を移動しています。カスタム セグエは、CGAffineTransformMakeScale を使用して、宛先コントローラーでズーム効果を作成します。

プロジェクトをポートレート モードで実行するとすべて問題なく動作しますが、ランドスケープ モードに変更すると問題が発生します。宛先コントローラーは縦向きで画面に表示され、正しいスケール (1.0、1.0) にアニメーション化され、アニメーションが完了すると正しい向きに変わります。これは私にとって本当に混乱を招くものであり、この問題についてオンラインで何も見つけることができないため、どんな助けも大歓迎です.

これをテストするために使用するプロジェクトでは、2 つのビュー コントローラーを使用し、それぞれにセグエをトリガーするボタンがあります。

これは私の CustomZoomSegue.m ファイルです:

#import "CustomZoomSegue.h"

@implementation CustomZoomSegue

- (void)perform
{
    UIViewController *destinationViewController = (UIViewController *)self.destinationViewController;
    UIViewController *sourceViewController = (UIViewController *)self.sourceViewController;
    UIWindow *mainWindow = [[UIApplication sharedApplication].windows objectAtIndex:0];

    UIView *sourceView = [sourceViewController view];
    UIView *destinationView = [destinationViewController view];

    destinationView.frame = sourceView.frame;
    [mainWindow addSubview:destinationView];

    [destinationView setAlpha:0.0f];
    [destinationView setTransform:CGAffineTransformMakeScale(0.0, 0.0)];

    // slide newView over oldView, then remove oldView
    [UIView animateWithDuration:0.8
                     animations:^{
                         [destinationView setTransform:CGAffineTransformMakeScale(1.0, 1.0)];
                         [destinationView setAlpha:1.0f];
                     }
                     completion:^(BOOL finished){
                         [destinationView removeFromSuperview];
                         [sourceViewController presentViewController:destinationViewController animated:NO completion:nil];
                     }];
}

@end

なぜこれが起こるのか誰にも分かりますか?それは私を夢中にさせています

4

2 に答える 2

0

サブビューとして宛先ビューをソースビューに追加することで、これを機能させました。メインウィンドウに直接追加する前に。

アニメーション ブロックでスケールとズームを同時に管理するコードを次に示します。

- (void)perform
{
    UIViewController *sourceViewController = (UIViewController *) self.sourceViewController;
    UIViewController *destinationViewController = (UIViewController *) self.destinationViewController;

    [sourceViewController.view addSubview:destinationViewController.view];
    [destinationViewController.view setFrame:sourceViewController.view.window.frame];

    [destinationViewController.view setBounds:sourceViewController.view.bounds];
    CGSize screenSize = [[UIScreen mainScreen] bounds].size;
    [destinationViewController.view setCenter:CGPointMake(screenSize.width/2 + 127, screenSize.height/2 - 138)];

    [destinationViewController.view setTransform:CGAffineTransformMakeScale(0.0,0.0)];

    [UIView animateWithDuration:1.8
                          delay:0.0
                        options:UIViewAnimationOptionCurveEaseOut
                     animations:^{
                         [destinationViewController.view setAlpha:0.0];
                         [destinationViewController.view setTransform:CGAffineTransformMakeScale(1.0,1.0)];
                         [destinationViewController.view setAlpha:0.8];
                     }
                     completion:^(BOOL finished){
                         [destinationViewController.view setAlpha:1.0];
                         [destinationViewController.view removeFromSuperview];
                         [sourceViewController presentViewController:destinationViewController animated:NO completion:nil];
                     }];
}
于 2013-08-12T10:49:32.657 に答える
0

問題は、View Controller を表示する前に宛先ビューをアニメーション化することに関連している可能性があると思います。コントローラーはビューの回転に関与していますが、表示されるまで回転するように求められることはありません。最初に提示してから、ソース ビューと宛先ビューの画像を使用してアニメーションを実行すると、より良い結果が得られると思います。

于 2013-08-09T12:12:25.133 に答える