web-dev-qa-db-ja.com

情報ボタンをクリックしながら2つのUIViewControllers間でフリップアニメーションを行う方法は?

「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を表示する必要があります)、フリップ効果のある情報ボタンをクリックしますか?

36
Rajkanth

View Controllerに切り替えるには:

viewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:viewController animated:YES completion:nil];

それを反転するには:

[self dismissViewControllerAnimated:YES completion:nil];
126
Filip Radelic

これは私がそれをやっている方法です:

 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];

クレジットはフェイザーに送られます ここ

21

Cocoa TouchのMVC構造を理解する上で根本的な欠陥があります。つまり、View ControllersViewsは比較可能で類似しています。真実は、そうではありません。

特定の質問に戻ります。はい、アニメーションはView ControllerではなくViewに基づいています。ただし、各ビューは、View Controllerのいずれかで制御する必要があります。そして、これはどのビューに属し、どのコントローラーに属するかは完全にあなた次第です。あなたの場合、アニメーションは、2つの異なるコントローラーを持つ2つのビュー間で発生する可能性があります。または、同じコントローラーの2つのビュー間で発生する可能性もあります。

コードサンプルについては、Xcodeのデフォルトテンプレートの1つであるtility Applicationをご覧になることをお勧めします。

5
Di Wu
  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)

    }
1
taha

簡単なコード行

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];
0
User558