21

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

7 に答える 7

26

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

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

[UIView transitionWithView:containerView
       duration:0.2
       options:UIViewAnimationOptionTransitionFlipFromLeft
       animations:^{ [fromView removeFromSuperview]; [containerView addSubview:toView]; }
       completion:NULL];
于 2010-12-28T00:58:24.153 に答える
13

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

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

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

    [UIView transitionFromView:view1
                        toView:view2
                      duration:0.5
                       options:UIViewAnimationOptionTransitionFlipFromRight |
                               UIViewAnimationOptionAllowUserInteraction    |
                               UIViewAnimationOptionBeginFromCurrentState
                    completion:nil];
于 2011-03-03T16:35:03.857 に答える
7

これが私の作業ソリューションスタブです。2時間かかった単純なものです。物事を反転するためのボタンが1つありますUIView。これは、反転アニメーションと交換したい2つのビューを保持するパネルと呼ばれます。

-(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;
     }];
}
于 2012-01-27T02:09:27.683 に答える
5

同じ問題に遭遇したので、Eric と Sam に同意します。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];   
于 2011-09-08T18:31:31.640 に答える
1

私は同じ要件を持っていて、レイヤーの使用 (UIView を処理したいだけの場合は非常に複雑になります) から、「コンテナー」が必要であるという提案まで、多くのアプローチを見てきました。しかし、トランプやゲーム タイルをめくるように、何かを前後に切り替えたい場合は、1 行の変更を行いました。

(注: 私は (ゲーム用に) グリッドに UIView (タイル [x] [y]) の配列を持っています。私はすべての画像ファイル名をデータベース テーブル/配列に持っており、UIImageView の UIImage に動的にロードされます。 「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つのサブビューは含まれません。これは、ビューの階層などを含むコンテナーの配列を持ちたくなかったため、私の場合ははるかに便利です...新しいレベルなどでは、常に配列をリロードしますとりあえず...

于 2011-09-04T00:50:31.947 に答える
0

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

> superview
>     another view
>        backview
>        frontview

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

}

(別のビュー)をfrontViewのサイズに等しくしたい場合があります

于 2015-08-04T22:27:55.073 に答える
0

コンテナ ビューには無地の背景色が必要であることに注意してください。これは、クリア カラー以外のことを意味します。これは私のミスであり、理解するのにかなりの時間を費やしました。

于 2012-05-21T13:45:00.240 に答える