3

UIView 内でスクロール ビューを回転させると、デフォルトの自動サイズ変更動作を使用してスクロール ビューが正しく配置されません。

したがって、回転が発生すると、willRotateToInterfaceOrientation私は呼び出し[self.view setNeedsLayout];、私のlayoutSubviews方法は次のとおりです。

- (void)layoutSubviews {
    NSLog(@"here in layoutSubviews");
}

しかし、メソッドにブレークポイントを設定すると、メソッドに入らないようです。

それを機能させるために何か他のことをする必要がありますか?

ありがとう。

4

5 に答える 5

3

willRotateToInterfaceOrientationは、向きが変更される前に呼び出されているため、UIViewのサイズは引き続き古いままです。代わりにdidRotateFromInterfaceOrientationを使用してみてください。

また、効果を追加するために、willRotateToInterfaceOrientationでscrollView(UIAnimationブロック内にある可能性があります)を非表示にし、サイズを変更してから、didRotateFromInterfaceOrientation(アニメーションブロック内にある可能性があります)に表示します。

これが私のアプリの1つからのスニペットです:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.3f];
self.myScroll.hidden = YES;
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
[UIView commitAnimations];
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.3f];
self.myScroll.hidden = NO;
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
[UIView commitAnimations];
}

UIInterfaceOrientationIsPortrait(orientation)またはUIInterfaceOrientationIsLandscape(orientation)を使用して新しい方向を確認することで、凝ったことを行うこともできます。

于 2010-10-29T13:10:32.613 に答える
2

[someScrollView setNeedsLayout]ビューのサイズが変更または移動されていない場合、呼び出しは実際には何も行わない可能性があります。あなたが言うように、デフォルトの動作はまったくサイズ変更しないことであるため、そのメソッドはデフォルトの自動サイズ変更動作を使用して呼び出されることはありません。ほとんどの場合、を設定する必要がありますsomeScrollView.autoresizingMask。インターフェイスが回転すると、ビュー自体のサイズが変更され、layoutSubviews呼び出されます。

于 2012-03-13T22:06:08.043 に答える
1

ViewController には layoutSubviews メソッドがないため、このメソッドは呼び出されません。

呼び出すと、View Controller: のビューのメソッドが[self.view setNeedsLayout];呼び出されます。layoutSubviews[self.view layoutSubviews]

これを機能させるには、UIScrollview をサブクラス化する必要があります。

于 2012-02-23T09:11:42.143 に答える
0

実際には、ビュー コントローラーの willAnimateRotationToInterfaceOrientation:duration: メソッドをオーバーライドする必要があるでしょう (私の例から抜粋):

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
                                        duration:(NSTimeInterval)duration {
    if (UIInterfaceOrientationIsPortrait(toInterfaceOrientation)) {
        boardView.frame = CGRectMake(0, 0, 320, 320);
        buttonsView.frame = CGRectMake(0, 320, 320, 140);
    } else {
        boardView.frame = CGRectMake(0, 0, 300, 300);
        buttonsView.frame = CGRectMake(300, 0, 180, 300);        
    }

}

于 2012-01-29T01:25:21.143 に答える
0

willAnimate... をオーバーライドして、ビューの新しいフレームを設定する必要があります。Layoutsubviews は、回転中に自動的に呼び出される必要があります。

于 2016-02-06T23:51:23.097 に答える