web-dev-qa-db-ja.com

transitionFromViewおよびtransitionWithViewを使用した遷移動作

2つのサブビュー(view1とview2)の間に遷移を作成しようとしています。ボタンを押すと、view1(前)が反転してview2(後)が表示されます。私はtransitionFromViewとtransitionWithViewの両方を試しました。それぞれ機能しますが、それぞれに問題があります。

transitionFromView-スーパービューを反転します(サブビューではなくウィンドウビュー全体が反転します)。この反転が発生すると、1つのサブビューは反転前のスーパービューの前面にあり、もう1つのサブビューは反転の背面にあります。しかし、私はスーパービューを反転させたくはなく、サブビューだけを反転させます。

transitionWithView-サブビューのみを反転しますが、遷移が発生する前に「to」ビューが表示されます。

誰か提案がありますか?

-(IBAction) button1action:(id) sender {  

 if ([sender tag] == 0) {  

  [UIView transitionFromView:view2 toView:view1 duration:2.0   
  options:UIViewAnimationOptionTransitionFlipFromLeft   
  completion:nil];   
}  

 else {  
  [view1 removeFromSuperview];    
  [self.view addSubview:view2];  
  [UIView transitionWithView:view2   
    duration:2.0  
    options:UIViewAnimationOptionTransitionFlipFromRight +  
    UIViewAnimationOptionShowHideTransitionViews  
      animations:^{}   
     completion:nil];  
 }
}
21
David

アニメーションブロックのサブビューを削除して追加する必要があります。また、transitionWithViewは、スーパービューを引数として取るはずだと思います。これを正しく行うために必要なことは、反転するビューと同じサイズのコンテナビューを使用することだと思います。

これはドキュメントからコピーされます:

[UIView transitionWithView:containerView
       duration:0.2
       options:UIViewAnimationOptionTransitionFlipFromLeft
       animations:^{ [fromView removeFromSuperview]; [containerView addSubview:toView]; }
       completion:NULL];
26
Erik B

私はこれとまったく同じ問題に遭遇し、以前の回答に同意します。あるサブビューから別のサブビューへの遷移をアニメーション化するには、コンテナービューが必要なようです。

私はtransitionFromViewアプローチを使用しています。アニメーションの背景を作成するには、コンテナービューの背景を含むスーパービューも必要です。

私のコードは次のようになります:

    [UIView transitionFromView:view1
                        toView:view2
                      duration:0.5
                       options:UIViewAnimationOptionTransitionFlipFromRight |
                               UIViewAnimationOptionAllowUserInteraction    |
                               UIViewAnimationOptionBeginFromCurrentState
                    completion:nil];
13
Sam

これが私の実際のソリューションスタブです。2時間かかった簡単なものです。物事を反転するボタンが1つあり、フリップアニメーションと入れ替えたい2つのビューを保持するUIViewというパネルがあります。

-(void)viewDidLoad{
    [super viewDidLoad];
    UIButton *btnFlip = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    btnFlip.frame = CGRectMake(10, 10, 50, 30);
    [btnFlip setTitle:@"flip" forState:UIControlStateNormal];
    [btnFlip addTarget:self action:@selector(flip) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btnFlip];

    panel = [[UIView alloc] initWithFrame:CGRectMake(10, 40, 300,300)];
    panel.backgroundColor = [UIColor darkGrayColor];
    [self.view addSubview:panel];

    panelBack = [[UIView alloc] initWithFrame:CGRectMake(10, 40, 280, 200)];
    panelBack.tag = 1;
    panelBack.backgroundColor = [UIColor brownColor];
    [panel addSubview:panelBack];

    panelFront = [[UIView alloc] initWithFrame:CGRectMake(10, 40, 280, 200)];
    panelFront.tag = 2;
    panelFront.backgroundColor = [UIColor whiteColor];
    [panel addSubview:panelFront];

    displayingFront = TRUE;
}

-(void)flip{

    [UIView transitionWithView:panel 
    duration:0.5
    options:(displayingFront ? UIViewAnimationOptionTransitionFlipFromRight : UIViewAnimationOptionTransitionFlipFromLeft)
    animations:^{ 
        if (displayingFront) {
            //panelFront.hidden=TRUE;
            //panelBack.hidden = FALSE;
            [panelFront removeFromSuperview];
            [panel addSubview:panelBack];
        }else{
            //panelFront.hidden=FALSE;
            //panelBack.hidden = TRUE;
            [panelBack removeFromSuperview];
            [panel addSubview:panelFront];
        }
     }
     completion:^(BOOL finished){
         displayingFront = !displayingFront;
     }];
}
7
Rui Nunes

同じ問題に遭遇したとき、私はエリックとサムに同意します。切り替えたい適切なサイズのコンテナービューを作成する限り、transitionWithViewまたはtransitionFromViewはどちらも上記のとおりに動作します。そうでない場合、ウィンドウ全体が反転します。

したがって、view1が最初のサブビューであり、view2に切り替えたい場合は、

UIView *containerView = [[UIView alloc] initWithFrame:appropriateSize];
[containerView addSubview:view1];

アニメーションを作成する最も簡単な方法は、おそらく次のとおりです。

[UIView transitionFromView:view1 
                    toView:view2 
                  duration:2.0   
                   options:UIViewAnimationOptionTransitionFlipFromLeft   
                completion:nil];   
5
Hal

同じ要件があり、多くのアプローチが見られました-レイヤーの使用(UIViewを処理したい場合は非常に複雑になる)から、サブビューに移行するために「コンテナー」が必要であるという提案まで。しかし、トランプやゲームタイルを裏返すなど、表と裏を切り替えるだけの場合は、1行変更しました。

(注:(ゲームの)グリッドにUIViews(tiles [x] [y])の配列があります。すべての画像ファイル名はデータベーステーブル/配列にあり、UIImageViewsのUIImagesに動的に読み込まれます。 「tileBackPicImageNM」という名前のUIImageのカードまたはタイルの「裏」の画像。

したがって、前の画像を後の画像に単純に入れ替えた私のコードは次のとおりです。

[tiles[indexX][indexY] setImage:[UIImage imageNamed:tileBackPicImageNM]];

これは正常に動作します。

しかし今、フリッピングアクションを表示するには、次のようにします。

[UIView transitionWithView:tiles[indexX][indexY] duration:0.3 options:UIViewAnimationOptionTransitionFlipFromLeft 
                    animations:^{  
                        [[indexX][indexY] setImage:[UIImage imageNamed:tileBackPicImageNM]];
                    }
                    completion:NULL];    

さまざまな「期間」パラメータを試してみました。その後、それをフロートにして、viewDidLoadルーチンで設定しました。 0.3より速い場合はほとんど表示されず、1または2の値は非常に遅いです...

これには2つのサブビューが含まれていません。これは、ビューの階層などを含むコンテナの配列が必要ないため、私の場合ははるかに便利です。新しいレベルなどでは、常に配列を再ロードします。とにかく...

1
harry

コンテナービューには無地の背景色が必要であることを覚えておいてください。これは明確な色以外の何かを意味します。これは私の間違いであり、それを理解するのに非常に長い時間を費やしました。

0
Ilker Baltaci

transitionFromViewを使用すると、前面ビューと背面ビューの両方が別のビュー(スーパービューではない)内にある必要があります。この方法では、画面全体が反転することはありません。

> superview
>     another view
>        backview
>        frontview

UIView.transitionFromView(frontView、toView:backView、duration:0.5、options:.TransitionFlipFromLeft | .ShowHideTransitionViews){終了

}

(別のビュー)をfrontViewのサイズに等しくすることができます

0
Ahmed Onawale