带有contentInset的UIScrollView打破了UISearchBar“autofocus”

时间:2012-05-24 02:40:22

标签: ios uiscrollview

我在UIScrollView中有一个UISearchBar(好吧,确切地说是一个AQGridView)。现在,searchBar最初将被隐藏(例如,您在音乐应用程序中看到的)。由于UIScrollViews没有标题视图,我将它放在UIScrollView框架之外的-40点,并将contentInset设置为40点。

searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0.f, -40.f, 320.f, 40.f)];
gridView.contentInset = UIEdgeInsetsMake(0.f, 40.f, 0.f, 0.f);

现在从外观和一般行为来看,几乎完全符合我的要求。搜索栏已隐藏,但我可以向上滚动以显示它。

现在就是这样:

当我触摸searchBar以使其聚焦并输入一些文本时,当searchBar不完全可见时,一切正常除了。在这种情况下,UIScrollView会尝试自动滚动它以完成可见性。但是,它向错误的方向滚动。

因此,当隐藏搜索栏顶部的10个点时,滚动视图会滚动向下而不是向上滚动。

这可能是一个有点模糊的问题,但也许有人可以在这里说出我的错误......我能在这里找到的唯一一个线索是这个:uitableview contentInset issue但这似乎也没有帮助我情况下。

2 个答案:

答案 0 :(得分:4)

我遇到了同样问题但CodaFi的解决方案无法解决我的问题。 所以我怀疑这个解决方案是正确的答案。

以下是我的情况和问题的描述: 我想将UINavigationBar添加到UIScrollView的ContentSize区域的ContentInset区域和UIWebView中,这样当向下滚动时,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点)。 如果我们(开发人员)设置内容插入区域并与之交互,我无法理解scrollview的行为。谈论它的文件和参考文献真的很少。我希望我的假设是错的,将来有人可以纠正我并帮助我们找到真相。

最后,虽然我找不到“真正的”答案,但实际上我找到了解决这个问题的方法(就像治疗症状的补救措施一样)。这是代码:

- (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
        }
    }
}

答案 1 :(得分:1)

-scrollToVisibleRect:animated:中的-setContentOffset:animated:-searchBarTextDidBeginEditing可以阻止大部分错误滚动。