我遇到了同樣的問題,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
}
}
}
也許我應該補充一點,實際上我第一次點擊搜索欄時,它會滾動40點,只是沒有任何動畫和一個非常微妙的延遲。隨後所有時間都會發生所描述的滾動。 – Dennis
之前使用過AQGridView,我可以說雖然它是一個精彩的類集合,但它的頭支持是GOD AWFUL。我只是把我的搜索欄放在UINavigationBar中。當然,如果這不是一個選項,鉤入UISearchBar的委託方法並自己爲scrollview設置動畫。 – CodaFi
那麼這將是一個選擇,我會給它一個去。但總的來說,我有這樣的感覺,如果這種標準行爲打破了,我在代碼中做了一些錯誤。所以我寧願解決問題而不僅僅是症狀。 – Dennis