3

私は、iPhoneのウィンドウの全体を占めるU​​IViewを持っています。それが景色に回転するとき、私は期待するように、それが所定の位置にスナップするまで、エッジは小さな黒いバーを取得します。黒いバーなしでUIViewを回転できますか?

私はその画面を回転させるには黒いバーは表示せず、通常はオフスクリーンの部分を表示するように、画面よりも大きくする必要があります。私はフレームとビューの境界を増加しようとしましたが、それはトリックを行うようには見えません。

誰でもこれを成功させましたか?

答えて

2

これを行うには、2つのことが必要です。

まず、ウィンドウのルートビューコントローラーは、常にウィンドウのサイズに合わせてビューのサイズを変更します。したがって、あなたの大きなビューは、ルートビューコントローラのビューのサブビューである必要があります(それがサイズ変更されないようにするため)。ルートビューコントローラのビューには、clipsToBoundsをNOに設定する必要があります。実際、大きなビューのすべての祖先はclipsToBoundsをNOに設定する必要があります。

第2に、ウィンドウが回転すると、ウィンドウの境界の外側に表示されるビューを明示的に隠すために、ブラックサブビューを与えます。これらの黒いサブビューは、ルートビューコントローラのビューの前に配置されます。

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    UIWindow *window = self.view.window; 
    [window bringSubviewToFront:window.rootViewController.view]; 
} 
2

2つのUIWindowが重なっている場合には、別の方法があります。 willAnimateRotationToInterfaceOrientationが呼び出されたときに一番手前のUIWindowの黒いバーのサブビューを直接検索し、明示的に非表示にすることです(バックグラウンドでは回転できないコンテンツが必要です)。 。私は現在、標準速度より遅いで回転するように画面を要求するアプリに取り組んでいます

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration { 
    UIWindow* window = self.view.window; 
    for (UIView* view in [window subviews]) { 
     if (!CGRectIntersectsRect(window.bounds, view.frame)) { 
      view.hidden = YES; 
     } 

     for (UIView* view_ in [view subviews]) { 
      CGRect frame = [view_ convertRect:view_.frame toView:window]; 
      if (!CGRectIntersectsRect(window.bounds, frame)) { 
       view_.hidden = YES; 
      } 
     } 
    } 
} 
+0

これは私にとってはうまくいきます。 – David

0

:次のコードは、深い二つのレベルを検索します。私自身の回転が始まる前に(標準の回転速度で)ビューをクリッピングする黒い回転矩形を停止するには、単にの横のボックスをチェックしてください。一般 - >デプロイメント情報 - >フルスクリーンが必要です

enter image description here

非表示ステータスバーボックスがチェックされていないが、私はまた、ステータスバーには、ビューコントローラに隠されています。

0

UINavigationControllerとUITabBarControllerはどちらも、デフォルトではlayer.masksToBoundsがYESに設定されているシステムサブビュー(UINavigationController:UINavigationTransitionView; UITabBarController:UITransitionViewとUIViewControllerWrapperView)を持っています。回転中に黒いエッジを除去するには、これらのレイヤーと他のすべての階層ビューのlayer.masksToBoundsをNOに設定する必要があります。

しかし、上記のシステムビューのレイヤーを変更することの効果がわからないので、アニメーションを完了したら、layer.masksToBoundsをYESに戻すことをお勧めします。

関連する問題