4

ECSlidingを使用していますが、この問題があります。

私のプロジェクトには、次のファイルがあります。

InitViewController (ECSlidingController)

FirstViewController (UIViewController)

SecondViewController (UIViewController)

LeftMenuViewController (UIViewController)

InitView を使用して、FirstView をトップビューとして設定します。

私のFirstViewにはボタンがあり、押すとSecondViewをトップビューとして設定します。

新しいビューを開くように、変化するトップビューをアニメーション化することはできますか? または、最初のビューのように ECSliding を使用する新しいビューを開くにはどうすればよいですか?

このコードを使用してトップビューを変更しています:

self.slidingViewController.topViewController = second;
[self.slidingViewController resetTopView];

私が望むアニメーションは、次のようなデフォルトのものである可能性があります。

[self presentViewController:(*UIViewController) animated:YES completion:nil];
4

5 に答える 5

3

ECSlidingViewController をサブクラス化します。サブクラスを DeckController と呼びます。

DeckController.h:

- (void)setTopViewController:(UIViewController *)topViewController withTransition:(CATransition*)transition;

DeckController.m で:

- (void)setTopViewController:(UIViewController *)topViewController withTransition:(CATransition*)transition {

    self.topViewController = topViewController;
    [UIView animateWithDuration:0.25f animations:^() {
        [[self.view layer] addAnimation:transition forKey:@"topViewTransition"];
    }];
}

次に、新しいトップ ビューに切り替えたいビュー コントローラーで、次のようにします。

CATransition *animation = [CATransition animation];
[animation setType:kCATransitionPush];
[animation setSubtype:kCATransitionFromRight];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[animation setFillMode:kCAFillModeBoth];
[animation setDuration:.25];

DeckController *deck = (DeckController*)self.slidingViewController;
[deck setTopViewController:newTopViewController withTransition:animation];
于 2013-06-20T00:00:11.583 に答える
0

おそらく最良の選択肢は、スライディング ビュー コントローラーのアニメーション メソッドを使用することです。トップ ビューを画面外でアニメーション化し、完了ブロックでトップ ビュー コントローラーを (2 番目に) 変更してから、新しいアニメーションを開始して、トップ ビューを画面上でアニメーション化します。

[self.slidingViewController anchorTopViewOffScreenTo:...
                                          animations:...
                                          onComplete:^{
    self.slidingViewController.topViewController = second;
    [self.slidingViewController resetTopView];
}];
于 2013-05-20T21:25:24.137 に答える
0

@Michael-Enriquezの回答が迅速に変換されました。

let viewController =  (self.storyboard?.instantiateViewControllerWithIdentifier("ViewController"))! as? ViewController
    let navController =  UINavigationController(rootViewController: viewController!)
    navController.view.frame =  self.slidingViewController().view.bounds
    navController.view.alpha = 0
    self.slidingViewController().view.addSubview(navController.view)
    UIView.animateWithDuration(0.25, animations: {
        navController.view.alpha = 1
        }, completion: {(finished:Bool) -> Void in
            navController.view.removeFromSuperview()
            self.slidingViewController().topViewController =  navController
    })
于 2016-08-11T11:33:31.050 に答える
0

左メニューのメニュー項目をクリックするときと同じ操作を使用するだけです。

[self.anchorTopViewOffScreenTo:ECRight animations:nil onComplete:^{
        CGRect frame = self.topViewController.view.frame;
        self.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"secondVC"];
        self.topViewController.view.frame = frame;
        [self resetTopView];
    }];

これを一般化するだけで、どこでも呼び出すことができます。それ自体でアニメーションを実行します。@Alex として実行できますが、カスタム アニメーションを実行する必要がない場合は、これで十分です。

注意。私の例では、ユーザーを特定のviewControllerに強制するために、initViewController(これECSlidingViewControllerであるため、に送信しています)でこれを使用しています。self以下の例のように、送信したばかりの subViewControllers のビューを変更する必要がある場合self.slidingViewController:

[self.slidingViewController anchorTopViewOffScreenTo:ECRight animations:nil onComplete:^{
        CGRect frame = self.slidingViewController.topViewController.view.frame;
        self.slidingViewController.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"secondVC"];
        self.slidingViewController.topViewController.view.frame = frame;
        [self.slidingViewController resetTopView];
    }];
于 2013-08-02T10:31:34.607 に答える
0

アニメーションを手動で作成topViewControllerし、最後に を設定して、スライディング ビュー コントローラーが期待どおりの状態になるようにすることができます。

SecondTopViewController *secondTopViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondTop"];
secondTopViewController.view.frame = self.slidingViewController.view.bounds;
secondTopViewController.view.alpha = 0;

// temporarily add the second top view so that we can animate it in.
[self.slidingViewController.view addSubview:secondTopViewController.view];

[UIView animateWithDuration:0.5 animations:^{
    secondTopViewController.view.alpha = 1;
} completion:^(BOOL finished) {
    // remove the second top view.
    [secondTopViewController.view removeFromSuperview];

    // let sliding view controlller take over from here
    self.slidingViewController.topViewController = secondTopViewController;
}];

ここで私の作業例を参照してください: https://github.com/enriquez/ECSlidingViewController/tree/so-16658539

于 2013-11-16T01:16:00.963 に答える