スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
このエントリーをはてなブックマークに追加

[iOS]UIViewControllerからUISplitViewControllerへ遷移するためのSegue

今回UIViewControllerでログイン処理を行った後にUISplitViewControllerへ遷移するという画面を作成しました。
その際に通常のSegueでは遷移できないため、CustomSegueを作成して独自に遷移することにしました。

StoryBoardは、このような作りになっています。
UIViewControllerからUISplitViewControllerへ遷移するためののSegue_1
このプロジェクトは "Master-Detail Application" テンプレートで作成しています。

スタートのUIViewControllerにはRoundRectボタンが一つだけ配置されています。
このボタンのactionCustomSegueを設定しています。

この状態のプロジェクトに[New File...]->[Objective-C class]を追加します。
継承クラスをUIStoryboardSegueに設定して作成してください。

作成したSegueクラスの .mファイル へ以下のソースコードを貼り付けてください。

//この時のファイル名をSplitViewFlipSegueとしています。
#import "SplitViewFlipSegue.h"

@implementation SplitViewFlipSegue
- (void)perform {
//sourceViewController:遷移前のコントローラ
//destinationViewController:遷移後のコントローラ
UIViewController *sourceViewController = (UIViewController *)self.sourceViewController;
UIViewController *destinationViewController = (UIViewController *)self.destinationViewController;

//UISplitViewControllerのDetailViewControllerクラスへDelegateを設定します。
UISplitViewController *splitViewController = (UISplitViewController *)destinationViewController;
UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
splitViewController.delegate = (id)navigationController.topViewController;

UIWindow *window = [UIApplication sharedApplication].keyWindow;
//一度rootに設定することで、回転方向の修正を行う
window.rootViewController = destinationViewController;
window.rootViewController = sourceViewController;

[UIView transitionWithView:sourceViewController.view.window
duration:0.5
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^{
/***************************************************
//iOS3.x系まで
[window addSubview:destinationViewController.view];
***************************************************/
//iOS4.x系から
window.rootViewController = destinationViewController;
}
completion:^(BOOL finished){
//アニメーション終了後の処理
}];
}
@end


あとは、このクラスを先のボタンに設定したCustomSegueへ設定すれば完了です。

追記:AppDelegateクラスの以下のメソッドの3行はコメントアウトしてください。
これらは、UISplitViewControllerクラスを利用する際の初期設定です。
//UISplitViewControllerの初期設定の名残を削除します
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
// UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
// UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
// splitViewController.delegate = (id)navigationController.topViewController;
return YES;
}
コメントで逆方向遷移の方もやっていただきました。
逆方向の遷移をするにはキーウィンドウを指定するとうまくいくようです。

#import "BackSplitViewFlipSegue.h"

@implementation BackSplitViewFlipSegue
- (void)perform {
//sourceViewController:遷移前のコントローラ
//destinationViewController:遷移後のコントローラ
UIViewController *sourceViewController = (UIViewController *)self.sourceViewController;
UIViewController *destinationViewController = (UIViewController *)self.destinationViewController;

UIWindow *window = [UIApplication sharedApplication].keyWindow;
//一度rootに設定することで、回転方向の修正を行う
window.rootViewController = destinationViewController;
window.rootViewController = sourceViewController;

[UIView transitionWithView:window
duration:0.5
options:UIViewAnimationOptionTransitionFlipFromRight
animations:^{
/***************************************************
//iOS3.x系まで
[window addSubview:destinationViewController.view];
***************************************************/
//iOS4.x系から
window.rootViewController = destinationViewController;
}
completion:^(BOOL finished){
//アニメーション終了後の処理
}];
}
@end
このエントリーをはてなブックマークに追加

tag : iOS Storyboard segues セグエ custom uiview uiviewcontroller uisplitviewcontroller 画面遷移 カスタム

コメントの投稿

非公開コメント

元の画面に戻る方法

逆に戻る方法、UISplitViewControllerからUIViewControllerに戻る方法が書かれていなかったので、同じようにやってみました。
正しいやり方かは、わかりませんが同じように
Customに設定したSegueを作り、


performメソッド内で、
11行目から14行目あたりを削除して、

21行目の
[UIView transitionWithView:sourceViewController.view.window

[UIView transitionWithView:window
のようにしてみたら、良い感じにできました。

参考までに。
こんな感じです。

- (void)perform {
//sourceViewController:遷移前のコントローラ
//destinationViewController:遷移後のコントローラ
UIViewController *sourceViewController = (UIViewController *)self.sourceViewController;
UIViewController *destinationViewController = (UIViewController *)self.destinationViewController;

UIWindow *window = [UIApplication sharedApplication].keyWindow;
//一度rootに設定することで、回転方向の修正を行う
window.rootViewController = destinationViewController;
window.rootViewController = sourceViewController;

[UIView transitionWithView:window
duration:0.5
options:UIViewAnimationOptionTransitionFlipFromRight
animations:^{
/***************************************************
//iOS3.x系まで
[window addSubview:destinationViewController.view];
***************************************************/
//iOS4.x系から
window.rootViewController = destinationViewController;
}
completion:^(BOOL finished){
//アニメーション終了後の処理
}];
}

Re: 元の画面に戻る方法

前にかなり無理矢理な方法でやった記事を書きました。
こちらの方がスマートに見えますが、windowをキーウィンドウにしてやるだけでアニメーションがうまく行く理由がやはり説明が付けにくいですね。
遷移後のUIViewControllerとウィンドウの間に何かがあるようですが、なんでしょうかね・・・。
ありがとうございます、記事に補足しておきます。
Translation


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。
プロフィール

チーズくん

Author:チーズくん
個人的メモをただ羅列しています。
twitter:@cheese1038

バロメーター
最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。