0

I'm building an iPad app with views that are split horizontally and animate in from the top and bottom (think of jaws sliding closed and open to appear and disappear respectively).

My problem is the layout of the custom jaws subview is broken only when the view loads in a landscape orientation. (The jaws-view container loads at the proper size, but the subsequent subviews for the top and bottom half are too tall, and going off the screen. They are the correct width though.)

I can start in portrait and then rotate and everything is arranged correctly.

I've tried setting the frame of the new view to the bounds of the original in a bunch of places (as suggested by many answers that didn't work for me, links upon request) but either haven't found the right spot, or need something more.

Do I need to do anything special to get the size to propagate? Is there a point before which I should not do animation? (I'm trying to move the top and bottom in my new view controller's viewDidLoad.)

4

2 に答える 2

2

これに対する解決策には、2 つの部分が必要でした。

最初はこの回答で説明されていました: https : //stackoverflow.com/a/8574519/1143123は、viewDidLoadの代わりにviewWillAppearメソッドを使用することを説明しています(以前に呼び出され、境界の「正しくない」値)。これにより、そのビューをランドスケープにロードするときにビューが適切にレイアウトされるという問題が解決されました (そして、その後の回転に伝播されました)。

2 番目の部分は、アニメーションを開始し、その間に回転を行うと、ビューがめちゃくちゃになる可能性があるということでした。アニメーション クラスを変更して、(フレームをスライドさせるのではなく) 中心座標のみを移動するように変更しました。最後に、これらの問題を示すクラスの ViewController に次をハードコーディングしました。

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    [super didRotateFromInterfaceOrientation:fromInterfaceOrientation];

    // The container view should match the size of the current view
    gameView.frame = self.view.bounds;

    CGFloat width = self.view.bounds.size.width;
    if(roundInProgress) {
         gameView.jawsTop.frame = CGRectMake(0, 0, width, self.view.bounds.size.height/2);
         gameView.jawsBottom.frame = CGRectMake(0, self.view.bounds.size.height/2, width, self.view.bounds.size.height/2);

    } else {
        // If round not in progress, game cards should be offscreen
        CGFloat height = self.view.bounds.size.height/2;
        gameView.jawsTop.frame = CGRectMake(0, -height, width, height);
        gameView.jawsBottom.frame = CGRectMake(0, self.view.bounds.size.height, width, height);

    }
}
于 2012-06-21T06:51:29.967 に答える
1

あなたのコードを見なくても、親ビューの「Autoresize Subviews」プロパティおよび/またはサブビューの自動サイズ設定に関係していると思います。Interface Builder でそのプロパティを変更して、問題が解決するかどうかを確認してください。

于 2012-06-14T12:34:03.460 に答える