2009-10-23 60 views
2

我似乎無法讓UISearchBar從導航欄中最左邊到最右邊的位置。在 - (無效)viewDidLoad方法中,我有以下代碼:UISearchBar和UINavigationItem

UISearchBar *sb = [[UISearchBar alloc] initWithFrame:self.tableView.tableHeaderView.frame]; 
sb.delegate = self; 
self.navigationItem.titleView = sb; 
[sb sizeToFit]; 
[sb release]; 

當你構建和運行,它乍看上去就好了。然而,仔細觀察,你可以看到左邊有一個空白/空格。這對於事物的宏偉計劃來說不是什麼大問題,但是當我點擊搜索欄開始搜索時,我將取消按鈕設置爲視圖的動畫。因爲搜索欄略微位於右側,動畫是生澀和取消按鈕脫落,像這樣的結尾: link text

它看起來好像UINavigationItem就像是有三個單元格的表,其中有一個在我無法移除的第一個和最後一個填充上 - 也沒有似乎有辦法將它們「合併」在一起,然後將搜索欄放在那裏。我知道這種看起來是可能的,因爲AppStore搜索在導航欄中有一個搜索欄,它一直走到邊緣。任何人都知道如何讓搜索欄一直走到邊緣,所以我的滑入取消按鈕動畫將正常工作?

回答

1

我想我找到了答案 - 雖然我還沒有測試過驗證。在我上面提供的問題,我有以下結構:

標籤欄控制器 - >導航控制器 - >視圖控制器(一個或多個)

在考慮中的搜索欄是在一個視圖控制器,這又是在導航控制器中,哪個導航控制器在標籤欄中。

我隨便看了斯坦福大學CS 193P(2009春季)的課程,而在第13講結束時,答案可能已經提出。艾倫Cannistraro指出,存在應用程序的結構應具有這樣的結構:

this structure http://img143.imageshack.us/img143/6/viewcontrollerstructure.jpg

其中底部視圖控制器(鄰近標籤欄控制器)是其具有搜索條控制視圖控制器。他警告說,如果沒有這樣做,你會「遇到問題」。可能是我面臨的問題?我相信是這樣。

0

也許蘋果正在使用UISearchDisplayController來做這些事情。

+0

我試過了UISearchDisplayController。但是,該「控制」將搜索欄放在表格標題中(不搜索時),而不是導航欄。然後,當您點擊搜索欄時,它會動畫並移動到導航欄,類似於「聯繫人」搜索。我不喜歡那樣。我希望它看起來就像AppStore搜索一樣,無論您正在搜索或不搜索,導航欄中的搜索欄REMAINS。這可能嗎? – tbehunin 2009-10-23 19:22:24

+0

從iPhone SDK獲取「默認情況下,導航欄左側顯示後退按鈕,中間顯示標題,您可以通過指定自定義左側視圖,中央視圖或右側視圖來更改此行爲。」所以也許你可以嘗試左視圖和中心視圖。是否有必要有一個真正的NavigationBar或僅僅是它的外觀? – caahab 2009-10-23 20:27:19

+0

我嘗試了一個自定義的左視圖和中心視圖,但仍然看起來不像AppStore搜索。 我知道它看起來像一個導航欄,通過隱藏真正的導航欄,並將搜索放在表視圖的標題。這工作完美。唯一的問題是,現在具有搜索欄的標題與屏幕一起滾動。我希望它像導航欄一樣靜止。任何其他想法?我只是想讓搜索看起來像AppStore的搜索。我不敢相信這很難做到。 :( – tbehunin 2009-10-23 22:40:12

5

其實,有一個非常簡單的解決方案。所有你需要做的就是創建一個零寬度視圖返回項目:

UIView *hackView = [[UIView alloc] initWithFrame:CGRectZero]; 
UIBarButtonItem *hackItem = [[UIBarButtonItem alloc] initWithCustomView:hackView];  
self.navigationItem.backBarButtonItem = hackItem; 
[hackView release]; 
[hackItem release]; 

UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero]; 
[searchBar sizeToFit]; 
self.navigationItem.titleView = searchBar; 
[searchBar release]; 

一定要做到這一點在你的loadView方法,而不是初始化。我不知道爲什麼這會有所作爲,但確實如此。

顯然它是關於時間。讓它在loadView中停止爲我工作,但將它放在viewWillAppear中(當然,只有一次檢查才能完成)。我認爲這個想法是在一些初始化完成後設置titleView。

2

下面的代碼隱藏的導航欄只爲這UIViewController中:

- (void)viewWillAppear:(BOOL)animated 
{ 
    [self.navigationController setNavigationBarHidden:YES animated:animated]; 
} 

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [self.navigationController setNavigationBarHidden:NO animated:animated]; 
} 

所以得到的UISearchBar在UINavigationBar的的榜眼秀,你的根視圖控制器上只是有你的搜索欄在導航欄會一般!