2014-01-07 34 views
11

我遇到搜索欄時出現問題,當它變爲firstResponder並且它辭職時,它會以一種奇怪的方式運行。UISearchBar自動調整大小和更改框架

搜索欄被添加爲

self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.view.frame.size.width, 44.0f)]; 
self.searchBar.translucent = NO; 
self.searchBar.barTintColor = [UIColor grayColor]; 
self.tableView.tableHeaderView = self.searchBar; 

self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar 
                  contentsController:self]; 
self.searchController.searchResultsDataSource = self; 

視圖控制器設定的JASidePanelController左面板表格視圖的頭部和它隱藏在中央面板當鍵盤顯示或隱藏:

- (void)keyboardWillAppear:(NSNotification *)note 
{ 
    [self.sidePanelController setCenterPanelHidden:YES 
              animated:YES 
              duration:[[note.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]]; 
    self.searchBar.showsCancelButton = YES; 
} 

- (void)keyboardWillDisappear:(NSNotification *)note 
{ 
    [self.sidePanelController setCenterPanelHidden:NO 
              animated:YES 
              duration:[[note.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]]; 
    self.searchBar.showsCancelButton = NO; 
} 

正常狀態 Normal state

當搜索欄變成firstResponder個它圍繞一個點了無論是移動還是向下指向隨機

Point up Point down



而當搜索欄辭職它動畫最多,達到窗口原點,然後返回到其自然框架

Stretching up

Reaching origin

這是一個sample project重現錯誤。

編輯:

@kwylezsuggestion,不必要的動畫時,如果辭職可以通過避免搜索欄的:

self.searchBar.clipsToBounds = YES; 
+0

將您的搜索欄作爲視圖控制器的視圖的子視圖,而不是作爲的tableView的的tableHeader修復向上/向下運動,如果沒有必須的tableHeader。 –

+0

這是真的,但我有內容背後的表格視圖,需要顯示時,用戶滾動......我可能會回到解決方案,雖然如果我沒有找到任何東西。 – Moxy

+0

查看我的回答 – codercat

回答

-1

我追蹤的問題到功能「_layoutSidePanels」在JASidePanelController。

在你的應用代理中,我註釋掉了下面的代碼,它似乎修復了灰色視圖的增長和縮小。

rootViewController.shouldResizeLeftPanel = YES; 

如果您通過以下方式與代碼,當選擇了搜索欄,你叫setCenterPanelHidden,隨後調用_layoutSidePanels,運行下面的代碼:

if (self.leftPanel.isViewLoaded) { 
    CGRect frame = self.leftPanelContainer.bounds; 
    if (self.shouldResizeLeftPanel) { 
     frame.size.width = self.leftVisibleWidth; 
    } 
    self.leftPanel.view.frame = frame; 
} 

更改側面板的框架似乎是原因,正如我所說的那樣,代碼解決了我的問題。

編輯:此外,起初它似乎像搜索欄上下移動一個點,但經過進一步檢查後,它似乎總是稍微在導航欄的下方,但您沒有注意到它,直到您選擇搜索欄和其他視圖「灰色」,所以藍色導航欄和淺灰色搜索欄之間的空白區域變得像下面的tableview其餘部分一樣深灰色。

編輯#2:花了我一段時間,但我設法弄清楚灰色面具來自哪裏。你UISearchDisplayController是什麼,是負責在搜索欄成爲第一個響應出現的灰色背景,當我刪除的代碼如下兩行你看到的問題就走了:

self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar contentsController:self]; 
self.searchController.searchResultsDataSource = self; 

這樣做只是爲了證明問題的原因,但刪除這些代碼行將禁用您使用搜索顯示控制器將獲得的任何功能。我不確切知道你希望做什麼,所以我不能給你任何關於如何繼續的建議,但希望我已經指出你正確的方向了!

+1

如你所說的問題是'UISearchDisplayController',即使在Apple的示例代碼中也有這個錯誤。與JASidePanels的動畫「衝突」通過裁剪到邊界來解決。 – Moxy

+0

如果我的答案有幫助,批准它將不勝感激! :) – Mike

+0

你的答案指出的問題是,但沒有解決它。在你回答之前,我有剪輯界限解決方案(檢查我的編輯)。如果你改變它並且它解決了問題,我會非常樂意批准你的。) – Moxy

0

您使用搜索欄和負責管理要搜索的數據的視圖控制器初始化搜索顯示控制器。當用戶開始搜索時,搜索顯示控制器將搜索界面疊加在原始視圖控制器的視圖上,並在其表格視圖中顯示搜索結果。

定製您的搜索欄視圖

Fixed - UISearchBar-bug-master

+0

您只改變了顏色(我希望我不會錯過任何東西)在輸入之前,間隙仍然顯示錶格視圖的背景(每2次一次) – Moxy

+0

搜索顯示控制器將搜索界面疊加在原始視圖控制器的視圖上。閱讀蘋果文檔 – codercat

+1

我知道,但它不應該離開那個差距。它不適用於iOS 6.「UISearchDisplayController」在iOS 7中有很多錯誤,但需要使用它。我正在尋找一種解決方案來改變它在這種情況下的行爲。我很欣賞這種努力,並且會很樂意接受一個答案(甚至在這個問題已經結束的時候獎勵另一個賞金),但是在這種情況下,說明問題在哪裏並沒有解決。 – Moxy

7

我通過創建ClipBounds套爲是一個UIView解決了這個問題,然後添加子視圖裏面的搜索欄。 然後將其包含在tableview標題中。它的工作現在。

感謝