22604


Objective-Cでモーダルでの画面遷移を行っています。  
プッシュではなくモーダルで、プッシュでの画面遷移のように  
右から左、左から右へ画面が移動できる方法はありますか？


CC BY-SA 3.0
2016-02-27T12:03:02.497
22603
2016-02-27T13:31:15.680
12886
question
ios objective-c xcode iphone
Objective-Cで右から左にモーダルで画面遷移する方法は？


以下のSegueを定義しておいて

[code]

    @interface MySegue : UIStoryboardSegue
    @end
    
    @implementation MySegue
    - (void)perform {
        __block CGRect dFrame = self.destinationViewController.view.frame;
        dFrame.origin.x = dFrame.size.width;
        self.destinationViewController.view.frame = dFrame;
        UIWindow *window = [[UIApplication sharedApplication] keyWindow];
        [window insertSubview:self.destinationViewController.view aboveSubview:self.sourceViewController.view];
    // Viewを載せるのは以下でも良い
    //    [self.sourceViewController.view addSubview:self.destinationViewController.view];
    
        [UIView animateWithDuration:0.4 animations:^{
            dFrame.origin.x = 0.0f;
            self.destinationViewController.view.frame = dFrame;
        } completion:^(BOOL finished) {
            [self.sourceViewController presentViewController:self.destinationViewController animated:NO completion:nil];
        }];
    }
    @end
    
[/code]

以下を実行すると右から左に遷移します。

[code]

    - (IBAction)showSecondView:(id)sender {
        [[[MySegue alloc] initWithIdentifier:@"MySegue" source:self destination:[[SecondViewController alloc] initWithNibName:nil bundle:nil]] perform];
    }
    
[/code]

戻る時はUnwind Segueに戻る為のアニメーションのSegueを作って使えば良いです。

Segueを利用しなくてもSegueのperformで行っている処理を書けば利用する事はできますが、再利用性を考えるとSegueを定義しておくと良いと思います。

**追記**

dismissする時は以下のようなSegueを作成して、StoryboardでしたらExitに接続してUnwindSegueにこのクラスを設定すると逆向き風のアニメーションになります。（このアニメーションはSource/Destinationどちらも動くようになっています。）

[code]

    @interface MyUnwindSegue : UIStoryboardSegue
    @end
    
    @implementation MyUnwindSegue
    - (void)perform {
        __block CGRect sFrame = self.sourceViewController.view.frame;
    
        __block CGRect dFrame = self.destinationViewController.view.frame;
        dFrame.origin.x = -dFrame.size.width;
        self.destinationViewController.view.frame = dFrame;
        UIWindow *window = [[UIApplication sharedApplication] keyWindow];
        [window insertSubview:self.destinationViewController.view aboveSubview:self.sourceViewController.view];
    
        [UIView animateWithDuration:0.4 animations:^{
            sFrame.origin.x = sFrame.size.width;
            self.sourceViewController.view.frame = sFrame;
    
            dFrame.origin.x = 0.0f;
            self.destinationViewController.view.frame = dFrame;
        } completion:^(BOOL finished) {
            [self.sourceViewController dismissViewControllerAnimated:NO completion:nil];
        }];
    }
    @end
    
[/code]


CC BY-SA 3.0
2016-02-27T12:31:46.120
22604
2016-02-27T13:31:15.680
2016-02-27T13:31:15.680
238
238
22603
answer