我遇到了几乎同样的问题,而 CodaFi 的解决方案无法解决我的问题。所以我有点怀疑这个解决方案是正确的答案。
这是我的情况和问题的描述:我想将 UINavigationBar 添加到 UIScrollView 的 ContentInset 区域和 UIWebView 的 ContentSize 区域,以便 UINavigationBar 可以在向下滚动时与屏幕顶部之外的 Web 内容一起消失。在 UINavigationBar 中,我添加了一个 UITextField 和一个 UISearchBar(是的,就像 Safari 一样)。在设置代码部分之后(在 viewDidLoad: 方法中):
navigationBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, -64, 320, 64);
textfield = [[UITextField alloc] initWithFrame:CGRectMake(5, 23, 150, 30)];
[navigationBar addSubview:textfield];
searchbar = [[UISearchBar alloc] initWithFrame:CGRectMake(200, 23, 100, 30)];
[navigationBar addSubview:searchbar];
[self.webView.scrollView setContentInset:UIEdgeInsetsMake(64, 0, 0, 0)];
[self.webView.scrollView setContentOffset:CGPointMake(0, -64) animated:NO];
[self.webView.scrollView addSubview:navigationBar];
问题是当我单击文本字段或搜索栏时,导航栏(实际上是整个视图)在屏幕中下降:文本字段为 41 点,搜索栏为 42 点(奇怪!)。所以它在屏幕上方留下了一个从 0 到 41(或 42)点的整个神秘空白。另一个奇怪的事情是它只发生一次!在我用手指滚动屏幕后,当我第二次单击文本字段或搜索栏时,它会消失并且再也不会出现。我相信我的问题的本质就像丹尼斯的一样。
在网上搜索了两天,不幸的是,我找不到解决这个问题本质的完美解决方案(实际上我什至不太确定问题的本质......)。
但正如我实验和观察的那样,我的假设是文本字段向下移动的 41 个点可能是因为它在导航栏上设置的相对位置(-64 + 23 = -41)。当它被用户点击时,系统(iOS)检查它的位置(虽然我已经在viewDidLoad中将contentOffset设置为-64:)并发现它不在用户的范围内并强制滚动视图向下滚动直到它出现了(向下 41 点)。如果我们(开发人员)设置内容插入区域并与之交互,我无法理解滚动视图的行为。很少有文档和参考资料在谈论它。我希望我的假设是错误的,将来有人可以纠正我并帮助我们找到真相。
最后,虽然我找不到“真正的”答案,但实际上我找到了解决这个问题的方法(比如治愈症状的药物)。这是代码:
- (void) scrollViewDidScroll:(UIScrollView *)scrollView {
if (scrollView.contentOffset.y < -64) { // if it is beyond the contentInset area
if (!scrollView.dragging && !scrollView.decelerating) { // scrollView is operated by system
[scrollView setContentOffset:CGPointMake(0, -64) animated:NO]; // freeze the screen at (0, -64) position
}
}
}