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

这个问题讨论了如何在UIScrollView中的视图之间创build空白。 约定的方法是增加UIScrollView框架的宽度,以在将滚动过去的视图之间创build间隙。 但是,当滚动视图是UINavigationController的子视图时,会出现问题。 UINavigationController在-viewDidLoad设置后,更改UIScrollView的框架。 提出的解决scheme是在-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在第一个地方改变框架?

编辑:

所以我subclassed UIScrollView,并发现一个称为[UIViewControllerWrapperView setFrame:]被调用,这反过来调用我的子类的-setFrame:方法来设置帧大小。 我不知道什么UIViewControllerWrapperView是或不是,我不知道它将有可能在它已经完成它的事情并正确设置帧大小后跳入。 我会继续调查。

我通过将UIScrollView作为View Controller视图的一个子视图来解决这个问题。 因此,UINavigationController单独离开UIScrollView,并保留该框架。 这也有额外的好处,允许我应用填充在我用来设置滚动视图相同的方法,而不是稍后在-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中做。 如果这不起作用,我会inheritanceUIScrollView并覆盖setFrame添加所需的差距。