「LoginViewController」という名前のログインページがあります。このページには情報ボタンがあります。クリックすると、アプリケーションに関する情報が表示されます。また、フリップアニメーションを使用してその情報ページを表示したいと思います。
情報ボタンを作成するためのコードは、
infoButton = [UIButton buttonWithType:UIButtonTypeInfoLight];
infoButton.frame = CGRectMake(285, 425, 30, 30);
infoButton.backgroundColor = [UIColor clearColor];
[infoButton addTarget:self
action:@selector(displayInfoView)
forControlEvents:UIControlEventTouchUpInside];
情報ボタンをクリックすると、displayInfoView
メソッドが呼び出されます。そこでUIView
を表示して、いくつかの情報を表示できます。私は正しいですか?
フリップアニメーションの場合、このコードを使用しました...
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:.8];
[UIView setAnimationTransition:([loginPageView superview] ? UIViewAnimationTransitionFlipFromLeft : UIViewAnimationTransitionFlipFromRight)
forView:mainView
cache:YES];
if ([infoView superview]) {
[infoView removeFromSuperview];
[mainView addSubview:loginPageView];
}
else {
[loginPageView removeFromSuperview];
[mainView addSubview:infoView];
}
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
[UIView commitAnimations];
ここでloginPageView
は、情報ボタンを含むログインビューです。 infoView
は、アプリケーションに関する情報を含むビューです。 mainView
は、現在のビューを保持する共通ビューです。
私の問題は、UIView
を表示する代わりに、情報ボタンをクリックしながら別のView Controllerクラスを表示できますか?フリップアクションはUIView
で正常に機能することを忘れないでください。しかし、UIViewController
で試してみると、問題が生じます。
誰かが私にUIViewControllerを表示する方法を提案できますか(私のアプリでは、AboutViewController
を表示する必要があります)、フリップ効果のある情報ボタンをクリックしますか?
View Controllerに切り替えるには:
viewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:viewController animated:YES completion:nil];
それを反転するには:
[self dismissViewControllerAnimated:YES completion:nil];
これは私がそれをやっている方法です:
AboutShowViewController *aboutShowViewController = [[AboutShowViewController alloc] initWithNibName:@"AboutShowViewController" bundle:[NSBundle mainBundle]];
[UIView beginAnimations:@"View Flip" context:nil];
[UIView setAnimationDuration:0.80];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight
forView:self.navigationController.view cache:NO];
[self.navigationController pushViewController:aboutShowViewController animated:YES];
[UIView commitAnimations];
[aboutShowViewController release];
クレジットはフェイザーに送られます ここ 。
Cocoa TouchのMVC構造を理解する上で根本的な欠陥があります。つまり、View ControllersとViewsは比較可能で類似しています。真実は、そうではありません。
特定の質問に戻ります。はい、アニメーションはView ControllerではなくViewに基づいています。ただし、各ビューは、View Controllerのいずれかで制御する必要があります。そして、これはどのビューに属し、どのコントローラーに属するかは完全にあなた次第です。あなたの場合、アニメーションは、2つの異なるコントローラーを持つ2つのビュー間で発生する可能性があります。または、同じコントローラーの2つのビュー間で発生する可能性もあります。
コードサンプルについては、Xcodeのデフォルトテンプレートの1つであるtility Applicationをご覧になることをお勧めします。
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(true)
// for back button
changeTransition()
}
//btnMap.addTarget(self, action: #selector(searchHotelsResultVC.goToMap), for: .touchUpInside)
//btnMap.addTarget(self, action: #selector(MapViewController.backToList), for: .touchUpInside)
func goToMap() {
// for pushing
changeTransition()
navigationController?.pushViewController(settingsVC, animated: false)
}
func backToList() {
// for dismiss
changeTransition()
navigationController?.popViewController(animated: false)
dismiss(animated: true, completion: nil)
}
func changeTransition() {
let transition = CATransition()
transition.duration = 0.5
transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
//transition.type = kCATransitionPush
transition.type = "flip"
transition.subtype = kCATransitionFromLeft
navigationController?.view.layer.add(transition, forKey: kCATransition)
}
簡単なコード行
YourViewController *city = [self.storyboard instantiateViewControllerWithIdentifier:@"YourViewController"];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:.5];
[self.navigationController pushViewController:city animated:YES];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.navigationController.view cache:NO];
[UIView commitAnimations];