This question讨论了如何在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
,因此永远不会进行更改。我已经尝试注册UIApplicationWillEnterForegroundNotification
和UIApplicationDidBecomeActiveNotification
,但这两个似乎都在UINavigationController更改之前发生,因此此时更改框架无效。
我应该在什么时候尝试更改框架尺寸以使其粘住,或者我可以以某种方式阻止UINavigationController首先改变框架?
所以我将UIScrollView子类化,发现正在调用一个名为[UIViewControllerWrapperView setFrame:]
的方法,该方法又调用我的子类的-setFrame:
方法来设置帧大小。我不知道UIViewControllerWrapperView
是什么或做了什么,我不确定它是否可以在它完成它之后跳入并正确设置帧大小。我会继续调查。
答案 0 :(得分:1)
我通过将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];
答案 1 :(得分:0)
尝试在viewDidLayoutSubviews中执行此操作。如果这不起作用,我会继承UIScrollView并覆盖setFrame以添加所需的间隙。