2011-07-11 6 views
6

this例です。UIViewフレームをアニメーション化すると、サブビューUIScrollViewが必ずアニメーション化されるとは限りません

私は、TabBarControllerをアニメーション化するときに(フルスクリーン効果のために)、PhotoViewerViewControllerのフレームをアニメートしています。 PhotoViewerはuiscrollviewを使用して、Appleの写真アプリと同じ種類の効果を生成します。何らかの理由で、時にはそれは私のPhotoViewerフレームと一緒にアニメートし、時にはそれはしません。

最初の例では、フレームサイズを大きくするとジャンプしますが、フレームサイズを小さくして(タブバーを元に戻す)きれいにアニメートします。

しかし、thisの例では、写真が垂直の場合、両方向にジャンプします。

どちらの場合も、スクロールビューで写真を拡大すると、両方向で正しくアニメーション表示されます。

私はそこに証拠があると知っていますが、ここで何が起こっているのか私の指を置くことはできません。 SO上のポストから適応

void (^updateProperties) (void) =^{ 
    self.navigationController.navigationBar.alpha = hidden ? 0.0f : 1.0f; 
    self.navigationController.toolbar.alpha = hidden ? 0.0f : 1.0f; 
    if (self.tabBarController) { 

     int height = self.tabBarController.tabBar.bounds.size.height; 
     for(UIView *view in self.tabBarController.view.subviews) 
     { 
      int newHeight; 
      UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; 
      if (UIInterfaceOrientationIsPortrait(orientation)) { 
       newHeight = hidden ? [[UIScreen mainScreen] bounds].size.height : [[UIScreen mainScreen] bounds].size.height - height; 
      } else { 
       newHeight = hidden ? [[UIScreen mainScreen] bounds].size.width : [[UIScreen mainScreen] bounds].size.width - height; 
      } 


      if([view isKindOfClass:[UITabBar class]]) 
      { 
       [view setFrame:CGRectMake(view.frame.origin.x, newHeight, view.frame.size.width, view.frame.size.height)]; 
      } 
      else 
      { 
       CGRect newFrame = CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, newHeight); 
       [view setFrame:newFrame]; 

       // update our VC frame with animation 
       [self.view setFrame:newFrame]; 

      } 

     } 
    } 

}; 

コード:githubUITabBar wont hide

完全なソース

は、ここに私のアニメーションブロックです。

答えて

6

何かが欠けている場合、アニメーションは時々動作し、時にはドンなら、私は、知ってみましょう」後者の場合、遅延された実行は、関連するプロパティをその最終値に設定することによって、それらを効果的にキャンセルさせるためです。

UIScrollViewの特定のケースでは、アニメーションブロックが閉じた後にアニメーションなしでアニメーションなしで呼び出されることがよくあります(-layoutSubviews)。このため、私は通常、ビュー階層内にUIScrollViewがあるその方法でレイアウトを行うことを避けようとしています(特にiOS 5より前は、UIScrollViewが本当にレイアウトを必要とする設定になっています)。

-[EGOPhotoImageView layoutScrollViewAnimated:]への電話を取り除き、-layoutSubviewsから電話を控えて、代わりに-setFrame:に追加することをお勧めします。

iOS4以上をターゲットにできる場合はUIViewAnimationOptionLayoutSubviewsもご覧ください。これをオプションとしてブロックベースのアニメーションを使用すると、他のものを変更することなく動作することがあります。

+0

ありがとうございます。後者はうまくいきませんでしたが、私は前者と一緒に行きます。 –

+0

私はまだそれを解決していないが、私はあなたが正しい方向に私を指摘したと思う。この特定の変換がPhotoImageView自体、またはそれを含むスクロールでトリガされているかどうかはわかりません。 –

+0

個人的には、スクロールビューの内容をスクロールビューのサブクラス自体にセンタリングするためのすべてのロジックを移動します。ここでは、-setContentOffset:をオーバーライドして、ズームデリゲートメソッドを使用するのではなくレイアウトを実行できます。 – hatfinch

0

iPad 4.2と4.3のシミュレータでgithubコードを試してみましたが、うまくいきました...画像のサイズ変更は一切ありません!いくつかのバージョンの問題があるかもしれません。 はまた、私はあなたのアニメーションブロックを変更しようとしたし、次は、同じ目的を果たす:

void (^updateProperties) (void) =^{ 
      self.navigationController.navigationBar.alpha = hidden ? 0.0f : 1.0f; 
      self.navigationController.toolbar.alpha = hidden ? 0.0f : 1.0f; } 

は、私は一般的に:)

+0

私がビデオでデモンストレーションしていたものをテストするには、タブバーコントローラーに追加する必要があります。また、ビルド時にflickrから画像を取得することをお勧めします。必要に応じてサンプルをまとめることができます。 –

+0

...それは助けになるでしょう。 – tipycalFlow