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];
}
}
アニメーションブロックのサブビューを削除して追加する必要があります。また、transitionWithViewは、スーパービューを引数として取るはずだと思います。これを正しく行うために必要なことは、反転するビューと同じサイズのコンテナビューを使用することだと思います。
これはドキュメントからコピーされます:
[UIView transitionWithView:containerView
duration:0.2
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^{ [fromView removeFromSuperview]; [containerView addSubview:toView]; }
completion:NULL];
私はこれとまったく同じ問題に遭遇し、以前の回答に同意します。あるサブビューから別のサブビューへの遷移をアニメーション化するには、コンテナービューが必要なようです。
私はtransitionFromViewアプローチを使用しています。アニメーションの背景を作成するには、コンテナービューの背景を含むスーパービューも必要です。
私のコードは次のようになります:
[UIView transitionFromView:view1
toView:view2
duration:0.5
options:UIViewAnimationOptionTransitionFlipFromRight |
UIViewAnimationOptionAllowUserInteraction |
UIViewAnimationOptionBeginFromCurrentState
completion:nil];
これが私の実際のソリューションスタブです。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;
}];
}
同じ問題に遭遇したとき、私はエリックとサムに同意します。切り替えたい適切なサイズのコンテナービューを作成する限り、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];
同じ要件があり、多くのアプローチが見られました-レイヤーの使用(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つのサブビューが含まれていません。これは、ビューの階層などを含むコンテナの配列が必要ないため、私の場合ははるかに便利です。新しいレベルなどでは、常に配列を再ロードします。とにかく...
コンテナービューには無地の背景色が必要であることを覚えておいてください。これは明確な色以外の何かを意味します。これは私の間違いであり、それを理解するのに非常に長い時間を費やしました。
transitionFromViewを使用すると、前面ビューと背面ビューの両方が別のビュー(スーパービューではない)内にある必要があります。この方法では、画面全体が反転することはありません。
> superview
> another view
> backview
> frontview
UIView.transitionFromView(frontView、toView:backView、duration:0.5、options:.TransitionFlipFromLeft | .ShowHideTransitionViews){終了
}
(別のビュー)をfrontViewのサイズに等しくすることができます