2012-05-24 55 views
0

我有一个UISearchBar里面的UIScrollView(以及确切地说是一个AQGridView)。现在searchBar应该被隐藏起来(例如你在音乐应用中看到的)。由于UIScrollViews没有标题视图,我将它放置在UIScrollView框架的外部-40点,并将contentInset设置为40点。UIScrollView与contentInset休息UISearchBar“自动对焦”

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

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

现在,这里的东西:

当我触摸搜索栏,给它焦点和输入一些文字,一切工作正常除了时,搜索栏是完全不可见的。在这种情况下,UIScrollView会尝试自动滚动它以完成可见性。但是,它向错误的方向滚动。

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

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

+0

也许我应该补充一点,实际上我第一次点击搜索栏时,它会滚动40点,只是没有任何动画和一个非常微妙的延迟。随后所有时间都会发生所描述的滚动。 – Dennis

+0

之前使用过AQGridView,我可以说虽然它是一个精彩的类集合,但它的头支持是GOD AWFUL。我只是把我的搜索栏放在UINavigationBar中。当然,如果这不是一个选项,钩入UISearchBar的委托方法并自己为scrollview设置动画。 – CodaFi

+0

那么这将是一个选择,我会给它一个去。但总的来说,我有这样的感觉,如果这种标准行为打破了,我在代码中做了一些错误。所以我宁愿解决问题而不仅仅是症状。 – Dennis

回答

4

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

这里是我的情况和问题描述: 我要到UINavigationBar的加入到ContentInset区和一个UIWebView在UIScrollView中的ContentSize区域,这样UINavigationBar的可以去,并与屏幕的顶部以外的网页内容消失时滚动下。而且在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 
     } 
    } 
} 
+0

thx为答案。我会尽快查看,并让你知道这是否对我有帮助。 – Dennis

+0

真棒,作品像魅力。就我而言,我认为我不需要第一个防守队员。相反,我正在检查我的UISearchBar是否为FirstResponder,因为我的滚动条在其他情况下也可能由系统操作。谢谢! – Dennis

+0

不客气。很高兴它适用于你的情况! – inexcii

1

要么-scrollToVisibleRect:animated:要么-setContentOffset:animated:-searchBarTextDidBeginEditing停止大部分错误的滚动。