2010-12-10 13 views
0

私はそれにUIViewController UIWebViewを持っています。私はUIWebViewを風景やポートレートモードでiPad画面の中央に配置したいと思います。だから、私はこのように実装しましたなぜ私のビューは正しくinterfaceOrientationの位置に配置されていませんか?

// UIViewController 
// InfoGraphicView is the UIWebView 

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    // Overriden to allow any orientation. 
    return YES; 
} 

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
           duration:(NSTimeInterval)duration { 
    if (toInterfaceOrientation == UIInterfaceOrientationPortrait || 
     toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) { 
     [self layoutPortrait]; 
    } else { 
     [self layoutLandscape]; 
    } 
} 

- (void)layoutLandscape { 
    NSLog(@"Layout Landscape"); 
    infoGraphicView.frame = CGRectMake(100, 100, 936, 700); 
} 

- (void)layoutPortrait { 
    NSLog(@"Layout Portrait"); 
    infoGraphicView.frame = CGRectMake(100, 100, 700, 936); 
} 

しかし、期待通りに動作していません。上のコードでは、UIWebViewが左上から100px(または何かの単位でも)離れることを期待しています。しかし、そうではありません。ポートレートモードでは画面の左上に表示され、横モードでは左上で部分的にオフスクリーンに見えます。

フレームをCGRectMake(-100, 100, 700, 936)と設定すると、画面の中央に配置されますが、その理由はわかりません。

いつものように、私は見落としている可能性が最も高いですが、私はそれを理解できません。どんな助けもいつものように大きく評価されました

答えて

1

infoGraphicViewで設定した座標は、一般的に画面ではなくスーパービューからの相対座標です。ビューは必ずしもサブビューをクリップするわけではありません。さらに、self.viewに自動的に設定されるシェイプは、Interface Builderで設定されたスケーリングフラグに依存します。しかし、私はデフォルトでは画面全体を埋めるように設定されていると思います。

しかし、間違いはwillRotateToInterfaceOrientation:duration:を使用していると思います。これは、回転が始まる前に呼び出されるので、self.viewは古いサイズを持ちます(つまり、ポートレートからランドスケープに、またはその逆に回転する場合は、ポートレートのサイズになります)。恐らくwillAnimateRotationToInterfaceOrientation:duration:をフックする方が良いでしょう。正しいサイズが設定されていればCoreAnimationブロック内にあるので、ビューは回転アニメーションの一部として拡大/縮小されます。

infoGraphicViewで設定したサイズ変更フラグもチェックすることをお勧めします。変更内容に加えて、自動的に有効になります。したがって、おそらくそれらをすべて無効にしたいと考えています。

1

これはおそらく、Webビューが入っているビューの問題です。使用される座標系はビューのスーパービューの座標系です。そのビューの回転中にサイズが変更されていない場合、このような予期しないレイアウトが表示されます。 superviewプロパティを使用して、ビューのスーパービューにアクセスできます。そのフレームを見るための1つの方法は、その説明を使用することです。この行をレイアウト方法の1つに入れてください。

NSLog(@"Superview: %@", [infoGraphicView superview]); 

これで、ビューの説明が印刷されます。

これを理解すれば、ウェブビューに同じレイアウトを使用する場合は、そのautoresizingMaskプロパティを使用できます。あなたはこのようにそれを設定した場合:

infoGraphicView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 

するとビューが自動的に右、左、トップを維持するために、その幅と高さを変更し、下の余白と同じになります。

関連する問題