我如何在进入前景时保留UIScrollView的框架



这个问题讨论了如何在UIScrollView中创建视图之间的间隔。商定的方法是增加UIScrollView框架的宽度,以在视图之间创建将滚动过去的间隙。但是,当滚动视图是UINavigationController的子视图时,问题就出现了。UINavigationController在-viewDidLoad中设置后改变了UIScrollView的框架。建议的解决方案是改变-viewDidAppear中的帧大小,此时UINavigationController已经完成了更改,并且更改将保持不变。

- (void)viewDidAppear:(BOOL)animated {
    CGRect frame = self.view.frame;
    frame.size.width += 20; // This gives a 20px gap width
    self.view.frame = frame;
}

我一直在我的应用程序中使用这个,它一直工作得很好,但是当应用程序被发送到后台然后再次检索时,我遇到了问题。似乎UINavigationController再次改变帧,将其重置为默认宽度,但这一次没有调用-viewDidAppear,因此更改从未进行过。我已经尝试注册UIApplicationWillEnterForegroundNotificationUIApplicationDidBecomeActiveNotification,但这两者似乎都发生在UINavigationController改变事物之前,所以在这一点上改变帧没有效果。

在什么时候我应该尝试改变帧的大小,这样它就会坚持下去,或者我可以以某种方式阻止UINavigationController在第一时间改变帧?

编辑:

所以我子类化了UIScrollView,发现一个叫做[UIViewControllerWrapperView setFrame:]的方法正在被调用,这反过来又调用了我子类的-setFrame:方法来设置帧大小。我不知道UIViewControllerWrapperView是什么或做什么,我不确定它是否有可能在它完成它的事情并正确设置帧大小后跳进去。我将继续调查。

我通过使UIScrollView成为视图控制器视图的子视图来解决这个问题。因此,UINavigationController不去管UIScrollView, frame被保留了下来。这也有一个额外的好处,允许我在相同的方法中应用填充,我使用设置滚动视图,而不是稍后在-viewDidLoad

总结一下,我这样做了:

CGRect frame = CGRectMake(0, 0, 320, 460);
scrollView = [[UIScrollView alloc] initWithFrame:frame];
// I do some things with frame here
CGRect f = scrollView.frame;
f.size.width += PADDING; // PADDING is defined as 20 elsewhere
scrollView.frame = f;
[self.view addSubview:scrollView];

尝试在viewDidLayoutSubviews中这样做。如果这不起作用,我将继承UIScrollView并重写setFrame以添加所需的间隙。

最新更新