2012-01-30 10 views
2

iOSで2つのビューをアニメーション化しているときに奇妙なエラーが発生しています。私の目標は、カスタム "スプリットビュー"から切り替えることです。iOS UIView setFrameアニメーションエラー

UIImageViewのY値に奇妙な "バンプ"が見えて、今私はかなりの間それを修正する方法が不思議に思っています。

これは、ビューコントローラのインタフェースです:私はやって両方のビュー保存のviewDidLoadで

@interface VideoSharing_Pad : UIViewController 
{ 
    IBOutlet UIView *videoCallView; 
    IBOutlet UIImageView *imageView; //This is "inside" mediaView 
    IBOutlet UIView *mediaView; 
    CGRect mediaRect; 
    CGRect videoCallRect; 
    CGRect imageRect; 
} 

//Get frames from XIB 
mediaRect = mediaView.frame; 
videoCallRect = videoCallView.frame; 
imageRect = imageView.frame; 

を、これは私が分割表示から切り替えたいときに実行されるコードですフルスクリーンモード:

- (IBAction)toggleFullScreen:(id)sender 
{ 
    if (iScreenMode == callAndShareMedia) { 
     CGRect fullScreenRect = CGRectMake(0, 0, 1024, 768); 
     CGRect dissapearRect = CGRectMake(0, - videoCallView.bounds.size.height, videoCallView.bounds.size.width, videoCallView.bounds.size.height); 

     [UIView animateWithDuration:1.0 
           delay:0.1 
          options: UIViewAnimationCurveEaseOut 
         animations:^{ 

          [videoCallView setFrame:dissapearRect]; 
          [imageView setFrame:fullScreenRect]; 
          [mediaView setFrame:fullScreenRect]; 
         } 
         completion:^(BOOL finished){ 

         }]; 

     iScreenMode = onlyShareMedia; 
     return; 
    } 
    else if (iScreenMode == onlyShareMedia) 
    { 

     [UIView animateWithDuration:1.0 
           delay:0.1 
          options: UIViewAnimationCurveEaseOut 
         animations:^{ 

          [videoCallView setFrame:videoCallRect]; 
          [mediaView setFrame:mediaRect]; 
          [imageView setFrame:imageRect]; 

         } 
         completion:^(BOOL finished){  
         }]; 
     iScreenMode = callAndShareMedia; 
     return; 
    }  
} 

本当にありがとうございます。どうもありがとう!

これはXIBのスクリーンショットです:

enter image description here

あなたはスクリーンショットと.hファイルから見ることができるよう、ImageViewのはUIViewの内部で他のUIView、videoCallViewは、mediaViewと呼ばれ、 1つはダミーの3つのピクチャです。

+0

私は 'videoCallView'と' mediaView'と 'imageView'の関係をよく理解していません。スクリーンショットと、どの領域がどのビューオブジェクトに対応しているかを説明するオーバーレイアノテーションを持つことを助けます。 – barley

+0

@ barleyこれはXIBのスクリーンショットです:http://i.imgur.com/xl0PU.pngスクリーンショットと.hファイルからわかるように、imageViewはmediaViewというUIViewの中にあります。もう1つのUIViewは、 videoCallViewは3つのダミー画像を持つものです。 –

答えて

1

本当に興味深い質問です。それは間違いなくスーパービューとサブビューを同時にアニメーション化することと関係しています。私はサンプルプログラムを行い、同様の状況を再現しました。

私の回避策は、スーパービュー(mediaView)のアニメーションを避け、サブビュー(imageView)のみを完全な矩形に展開することです。あなたのスーパービュー(mediaView)はあまり持っていないので、別のユーザーエクスペリエンスを与えるべきではありません。

ので、代わりに

[UIView animateWithDuration:1.0 
         delay:0.1 
        options: UIViewAnimationOptionCurveEaseOut 
       animations:^{ 
        [videoCallView setFrame:dissapearRect]; 
        [imageView setFrame:fullScreenRect]; 
        [mediaView setFrame:fullScreenRect]; 
}]; 

のあなたが戻って通常モードに来るための

[UIView animateWithDuration:1.0 
         delay:0.1 
        options: UIViewAnimationOptionCurveEaseOut 
       animations:^{ 
        [videoCallView setFrame:dissapearRect]; 
        [imageView setFrame:(CGRect){fullScreenRect.origin.x - mediaRect.origin.x, fullScreenRect.origin.y - mediaRect.origin.y, fullScreenRect.size}]; 
}]; 

を行うことができ、あなただけのmediaViewアニメーションを無視することができます。おそらく、他のアニメーションと一緒にtoggleButtonを移動(アニメーション化)したいと思うでしょう。

@ jrturtonさんの回答(2番目の部分)は素晴らしい回避策に見えましたが、サンプルコードでは機能しませんでした。それは(拡大)行く方法で働いたが、私は理由を知らない理由のために戻って(シュリンク)にぶつかった。しかし、私のコメントのために彼の答えを却下しないでください、それは私かもしれません。

+0

それはおそらくあなたではない、私の答えはかなり推測だった。 – jrturton

+0

@barley何が起こったのかを理解するために努力してくれてありがとう。私はあなたのコードを試してみました。これが結果です:(ボタンを気にせず、アニメーションを追加しなかった)http://youtu.be/y-wk-8yLW3M。 ご覧のとおり、画像が4:3の場合、エンドユーザーにとって大きな違いはありませんが、画像が16:9の場合、その解決法はそれほどエレガントではありません。ところで、元のコードの問題は、最初のものがOKなので、後退移行にあります。あなたのお時間をありがとう! –

+0

@PierluigiCifani心配はいりません。ストーリーボードのおかげで、問題自体を再現するのに5分かかりました。 (動作しなかった別の回避策を試してみると、別の問題でした... :))私はあなたが 'mediaView'からの灰色の領域と' videoCallView'からの黒い領域の境界について話していると仮定します。私の回避策はこれです: 'mediaView'のサブビューとしてグレーの空のビューを追加し、' mediaView'の代わりにそれをアニメートします。 – barley

0

興味深い質問です。作品からあなたのビデオを見ることはできませんが、アニメーション中にビューとそのサブビューの両方のサイズを変更していることが予想されます。自動認識マスクの干渉がありますサブビューのサイズを指定すると、補間されたフレームが適用されます。

もしあなたがそれについて考えるなら、同じ最終的な矩形に到達するためのより多くの地面を持っているので、イメージビューはスーパービューよりも素早く動くはずのステージもあります。アニメーションによって作られた補間は、これで苦労するかもしれません。

自動サイズ変更マスクを削除できない場合は、アニメーションを2つに分割してスーパービューのサイズを増やし、もう1つは画像ビューをフルサイズにズームする必要があります。

+0

いいえ、自動化マスクは確立されていません。私はmediaViewとimageViewフレームの両方を自分自身で制御したいので、必要とは思わなかった。 –

+0

OK、私の答えの2番目の部分はまだ立っています。 – jrturton

関連する問題