2012-05-24 47 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停止大部分錯誤的滾動。