ストーリーボードによるカスタムセグエの逆転
-
26-10-2019 - |
質問
新しいビューコントローラーをスタックに押し込むと発生するカスタムセグアニメーションがあります。ただし、上記のカスタムセグエとともに表示されたビューコントローラーをポップすると、デフォルトのナビゲーションコントローラーアニメーションが発生します(つまり、現在のビューコントローラーが右にアニメーション化され、親ビューコントローラーは左端から画面上で変換されます)。
私の質問はこれです:スタックからビューコントローラーをポップするときに起こるカスタムポップセグアニメーションを書く方法はありますか?
編集(ソリューション):
最終的に、選択した回答と同様のカスタムセグエを定義することになりました。ストーリーボードでは、カスタムセグエをチャイルドビューコントローラーから親にドラッグし、識別子と新しく書かれたリバースセグエをクラスとして与えました。はい、私はそれがモーダル移行とほぼ同じであることを認識しています。クライアントの要件はこの狂気を必要としていたので、誰もがコメントする前に、通常の状況下でこれを行う必要がないことを私が知っていることを理解してください。
- (void)perform {
UIViewController *src = (UIViewController *)self.sourceViewController;
UIViewController *dest = (UIViewController *)self.destinationViewController;
[UIView animateWithDuration:0.3 animations:^{
CGRect f = src.view.frame;
f.origin.y = f.size.height;
src.view.frame = f;
} completion:^(BOOL finished){
src.view.alpha = 0;
[src.navigationController popViewControllerAnimated:NO];
}];
}
解決
はい。これが私がトップレベルにポップする例です。ストーリーボードでセグエを作成するとき。属性インスペクターに新しい新しいセグエクラスを選択するか、入力します。
//
// FlipTopPop.h
#import <UIKit/UIKit.h>
@interface FlipTopPopToRoot : UIStoryboardSegue
@end
と
// FlipTopPop.m
#import "FlipTopPopToRoot.h"
@implementation FlipTopPopToRoot
- (void) perform {
UIViewController *src = (UIViewController *) self.sourceViewController;
[UIView transitionWithView:src.navigationController.view duration:0.5
options:UIViewAnimationOptionTransitionFlipFromBottom
animations:^{
[src.navigationController popToViewController:[src.navigationController.viewControllers objectAtIndex:0] animated:NO];;
}
completion:NULL];
}
@end
1つのレベルの変更だけをポップアップしたい場合は、このカスタムセグエを使用してください。
// PopSegue.h
#import <UIKit/UIKit.h>
@interface PopSegue : UIStoryboardSegue
@end
と
// PopSegue.m
#import "PopSegue.h"
@implementation PopSegue
- (void) perform {
UIViewController *src = (UIViewController *) self.sourceViewController;
[src.navigationController popViewControllerAnimated:YES];
}
@終わり
他のヒント
これに従っている人のために、iOS 7では両方の方法をアニメーション化できます。
SEGUEをプッシュするように設定し、プッシュ実装については以下のコードを参照してください。
https://github.com/dzamir/oldstylenavigationControllerAnimatedTransition
コメンターのLinusが指摘したように、提示された他のソリューションは、UiviewControllerの別のインスタンスを作成します。ここでのこのリンクは、リバースセグアニメーションを可能にする他の選択肢を説明していると思います。
http://robsprogramknowledge.blogspot.com/2012/05/back-segues.html