中央にビューがあり、その両側に 2 つのビューがあるアプリがあります。左または右から新しいナビゲーション コントローラーをビューにプッシュする左右の 2 つのナビゲーション バー ボタンが必要です。
NavigationController の pushviewController: メソッドを使用して新しいビューをプッシュしてビューを変更すると、ビューが右からスライドインして表示されます。これを左からスライドインするように変更するにはどうすればよいですか?
中央にビューがあり、その両側に 2 つのビューがあるアプリがあります。左または右から新しいナビゲーション コントローラーをビューにプッシュする左右の 2 つのナビゲーション バー ボタンが必要です。
NavigationController の pushviewController: メソッドを使用して新しいビューをプッシュしてビューを変更すると、ビューが右からスライドインして表示されます。これを左からスライドインするように変更するにはどうすればよいですか?
ビューコントローラーを押したときにアニメーションの方向を変更しました。ここでアニメーションの種類を変更できます[animation setSubtype:kCATransitionFromRight];
ViewController *elementController = [[ViewController alloc] init];
// set the element for the controller
ViewController.element = element;
// push the element view controller onto the navigation stack to display it
CATransition *animation = [CATransition animation];
[[self navigationController] pushViewController:elementController animated:NO];
[animation setDuration:0.45];
[animation setType:kCATransitionPush];
[animation setSubtype:kCATransitionFromRight];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault]];
[[elementController.view layer] addAnimation:animation forKey:@"SwitchToView1"];
[elementController release];
ナビゲーション コントローラーを使用する代わりに、ビューを移動するだけです。
CGRect inFrame = [currentView frame];
CGRect outFrame = firstFrame;
outFrame.origin.x -= inFrame.size.width;
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
[newView setFrame:inFrame];
currentView setFrame:outFrame];
[UIView commitAnimations];
UINavigationControllersでスライド方向を明示的に定義できるとは思いません。実行できる可能性があるのは、現在のビューをナビゲーションスタックからポップして、前のビューを表示することです。これにより、希望する方法でアニメーション化されます。ただし、現在のビューで何をするかに応じて異なるビューコントローラを表示する場合は、これが複雑になる可能性があります。
ワークフローがそれほど複雑でない場合は、現在のViewControllerで以前のViewControllerへの参照を保持できます。現在のビューで行う操作(テーブルビューセルの選択など)に応じて、前のViewControllerで必要なデータを変更してから呼び出すことができます。
[self.navigationController popViewController];
または正しい方法が何であれ(私はそれがどのようになっているのかにかなり近いと思います)。これにより、必要なアニメーションでナビゲーションスタックを下に移動できます。これは、ナビゲーションスタックに設定された数のビューがある場合に機能します。
Reed Olsen が言ったことに: 同じメソッドにスライドを開始し、ビューが表示されているかどうかを追跡する BOOL を追加するボタンを 1 つだけ接続する必要があります。原点を適切に設定するだけです。
- (IBAction)slideMenuView
{
CGRect inFrame = [self.view frame];
CGRect outFrame = self.view.frame;
if (self.viewisHidden) {
outFrame.origin.x += inFrame.size.width-50;
self.viewisHidden = NO;
} else {
outFrame.origin.x -= inFrame.size.width-50;
self.viewisHidden = YES;
}
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[self.menuView setFrame:inFrame];
[self.view setFrame:outFrame];
[UIView commitAnimations];
}
RTLNavigationController:UINavigationController を継承して、これらの関数を上書きできます。
- (void) pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
DummyViewController*dvc = [[DummyViewController alloc] init];
[super pushViewController:viewController animated:NO];
[super pushViewController:dvc animated:NO];
[dvc release];
[super popViewControllerAnimated:YES];
}
と
- (UIViewController *)popViewControllerAnimated:(BOOL)animated
{
UIViewController *firstViewController = [super popViewControllerAnimated:NO];
UIViewController *viewController = [super popViewControllerAnimated:NO];
[super pushViewController:viewController animated:animated];
return firstViewController;
}
そして、アプリケーションデリゲートで:
navCon = [[RTLNavigationController alloc] init];
rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];
rootViewController.contextDelegate = self;
DummyViewController *dvc = [[DummyViewController alloc]init];
[navCon pushViewController:dvc animated:NO];
[dvc release];
[navCon pushViewController:rootViewController animated:NO];
[self.window addSubview:navCon.view];
プッシュは左から右へ、ポップは右から左へ
「とがった」タイプのボタンを取得するには、別の方法を使用する必要があります。
AppDelegate で:
UITableViewController *first = [[RootViewController alloc] initWithStyle:UITableViewStylePlain];
UITableViewController *second = [[SomeOtherViewController alloc] initWithStyle:UITableViewStylePlain];
NSArray *stack = [NSArray arrayWithObjects: first, second, nil];
UINavigationController *nav = [[UINavigationController alloc] init];
[nav setViewControllers:stack animated:NO];