3

在 UIView 内旋转滚动视图时,滚动视图不会使用其默认的自动调整大小行为正确定位。

因此,当发生旋转时,在willRotateToInterfaceOrientation我调用中[self.view setNeedsLayout];,我的layoutSubviews方法如下:

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

但是在方法上放一个断点,它似乎永远不会进入方法。

我需要做其他事情才能让它工作吗?

谢谢。

4

5 回答 5

3

willRotateToInterfaceOrientation 在方向更改之前被调用,因此您的 UIView 仍将具有旧大小。尝试改用 didRotateFromInterfaceOrientation。

另外,为了增加效果,我会在 willRotateToInterfaceOrientation 中隐藏滚动视图(可能在 UIAnimation 块内),调整它的大小,然后在 didRotateFromInterfaceOrientation 中显示它(同样,可能在动画块内)。

这是我的一个应用程序的片段:

- (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 方法。

当你调用[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 回答