0

画面の右側には同じ情報が表示されますが、画面の左側には異なる情報が表示される UIViewControllers がいくつかあります。一方から他方に移行したいが、左側のみをアニメーション化する。つまり、左側を上にスライドさせ、右側を静止させたい。

-(void)goNextStep{
    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil];
    NSString *identifier = @"";
    if (_model.isLoggedIn) {
        //The user is already logged in, don't display the loginViewController
        // instead take them to the next viewController
        identifier = [_model nextStepIdentifier];
        if ([identifier isEqualToString:@""]) {
            identifier = @"loginController";
        }
    }else{
        identifier = @"loginController";
    }

    UIViewController *nextVC = (UIViewController *)[mainStoryboard instantiateViewControllerWithIdentifier:identifier];

    [nextVC setHidesBottomBarWhenPushed:YES];
    CATransition *transition = [CATransition animation];
    transition.duration = 0.5f;
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    transition.type = kCATransitionPush;
    transition.subtype = kCATransitionFromBottom;
    transition.delegate = self;
    //I would love to have
    //transition.rect=MyRect;
    [self.navigationController.view.layer addAnimation:transition forKey:nil];

    [self.navigationController pushViewController:nextVC animated:NO];
}

この遷移を画面の定義された四角形に制限したいと思います。

遷移アニメーションを四角形に制限する方法はありますか? もしそうなら、どのように?

4

2 に答える 2

0

ナビゲーションコントローラーのプッシュでこれを行う方法はありません。VC、特にコンテナVCは、一度に1つだけがインターフェイスを制御するという考えに基づいて設計されています。そのnavigationController.view.layerでさえあなたが操作することはできません。

このようなものに対する学校の解決策は、デリゲート(および場合によってはデータソース)アウトレットを持つビューを使用して、インターフェイスの右側を変更せずに実装することです。UITableViewを考えてください。このビューが必要なビューコントローラは、従来の方法でこのビューを階層に追加します。どのVCに表示されていても、同じデータソース(および同じデリゲート)を持っている可能性があります。

しかし、どのようにして望ましい移行を達成するのでしょうか?私はあなたが探しているものを正確に得る方法を考えることはできません(つまり、左側の通常のプッシュトランジションで右側にまったく変化がありません)が、これを考慮してください:

1)プッシュ前にプッシュされたVCで情報ビューがすべて同じ状態に設定されている場合、遷移はかなり良好に見えます。2)情報ビューにスライドクローズアニメーションがあり、それが本当に細い場合(「開く」コントロールを提供するのに十分な幅)、プッシュトランジションの前に閉じて、次のVCで閉じるように設定できます。オプションで、プッシュ後に再度開きます。

于 2012-09-12T14:44:15.787 に答える
0

わかりました、viewController A から viewController B への最初のプッシュでこの移行を処理する方法を見つけることができませんでしたが、適切に機能するように見える回避策を見つけましたが、必要な方法で正確に機能させるためにさらにマッサージが必要です、これは正しい方向です。

まず、viewController B に UIImageView を配置し、その viewController にアウトレットを作成しました。また、この UIImageView にタグを付けました.1000は私にとってはうまくいきました。

次に、viewController A のコードを次のように変更しました。

-(void)goNextStep{
    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil];
    NSString *identifier = @"";
    if (_model.isLoggedIn) {
        //The user is already logged in, don't display the loginViewController
        // instead take them to the next viewController
        identifier = [_model nextStepIdentifier];
        if ([identifier isEqualToString:@""]) {
            identifier = @"loginController";
        }
    }else{
        identifier = @"loginController";
    }

    UIViewController *nextVC = (UIViewController *)[mainStoryboard instantiateViewControllerWithIdentifier:identifier];

    UIImageView *infoImageView = [nextVC infoImageView];
    infoImageView.image = [self transitionImageFromView:self.transImageRect];

    [nextVC setHidesBottomBarWhenPushed:YES];
    [self.navigationController pushViewController:nextVC animated:NO];
}

したがって、次の viewController (B) に進む前に、viewController A の左側のスクリーンショットを取得し、viewController B に追加したばかりの画像をそのスクリーンショットに設定します。

ViewController BI に以下を追加しました。乱雑なコードは無視してください。

-(void)viewDidAppear:(BOOL)animated{
    CGRect stage = self.view.bounds;
    CGRect actor =self.formView.frame;
    CGRect spot = actor;
    CGRect cover= self.transitionView.frame;
    cover.origin.y=(0.0 - cover.size.height);
    actor.origin.y = stage.size.height;
    self.formView.frame=actor;

    [UIView animateWithDuration:0.5 animations:^{
        self.formView.frame=spot;
        self.transitionView.frame=cover;

    }];

}

#define kINFO_VIEW_TAG  1000

// answer the info image view
// add this declaration to view controller B .h file
//
- (UIImageView *)infoImageView {
    return (UIImageView *)[self.view viewWithTag:kINFO_VIEW_TAG];
}

これは、UIImageView を上に移動し、UIView をログイン フォームとともに所定の位置に移動する遷移を処理します。CATransitionすら必要ないようです。

于 2012-09-12T16:56:00.393 に答える