2010-08-14 102 views
26

我正在撕掉我的頭髮。我的客戶希望一個按鈕添加到如下面的例子搜索欄的左邊:將按鈕添加到UISearchBar的左邊

alt text http://www.erik.co.uk/images/IMG_0008.PNG

但我就是無法弄清楚如何做到這一點。 Apple似乎沒有提供任何記錄的方法來將自定義按鈕添加到UISearchBar,更不用說在搜索欄的左側。

我試過在界面生成器中添加一個UIToolbar,左邊有一個按鈕,但是我找不到任何樣式的組合,在這兩個列表中正確地給出了它們是一個的印象。總是有什麼樣子垂直取向的一個像素的差異,你可以從下面的圖片中看到:

alt text http://www.erik.co.uk/images/verticalalignment.png

我已搜索周圍,只是無法找到答案,但我們可以看到從截圖一定是可能的!

非常感謝您的幫助。

Erik

+0

的權利雨燕3.0的版本:[發佈7203924(https://stackoverflow.com/a/44621016/7203924) – 2017-06-19 02:03:43

回答

39

使用導航欄而不是工具欄。將搜索欄設置爲導航欄的標題視圖。

Interface Builder

screenshot 1

結果:

screenshot 2

+0

感謝KennyTM,一個完美的答案!正是我想要的! – 2010-08-14 12:57:48

+0

@Erik Carlson ...我也在尋找將按鈕添加到searchBar中...... – 2010-12-16 05:04:06

+0

你的照片已經死了。你可以吃嗎? – Will 2011-01-17 14:19:15

4

最簡單的解決辦法是增加你的搜索條在工具欄的頂部,(不),我給你的我在公司eBuildy中使用的最佳解決方案:

UIBarButtonItem *mySettingsButton = [[UIBarButtonItem alloc] initWithTitle:@"Settings" style:UIBarButtonItemStyleBordered target:self action:@selector(refresh)]; 
UIBarButtonItem *mySpacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 
UIBarButtonItem *myRefreshButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refresh)]; 
UIToolbar *myTopToolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0,0,320,40)]; 
UISearchBar *mySearchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(70,1,220,40)]; 

[myTopToolbar setItems:[NSArray arrayWithObjects:mySettingsButton,mySpacer,myRefreshButton, nil] animated:NO]; 
[self.view addSubview:myTopToolbar]; 
[self.view addSubview:mySearchBar]; 
8

第一個解決方案是使用UINavigationBar而不是UIToolbar,正如KennyTM注意到的那樣。但是當我需要使用3個按鈕(導航欄只允許使用2個按鈕)時,您可能對導航欄感到不滿意 - 請參閱左側圖片。這是我做的:

  1. 使用Toolbar有3個按鈕,並在搜索欄應該放置的地方Flexible Space Bar Button Item
  2. 將搜索欄放在(不在)的工具欄上。要在Interface Builder中這樣做,請不要將&拖放到工具欄上的搜索欄中。相反,將它放在附近的某個地方,然後使用鍵盤上的箭頭鍵將其移動到位置(或通過更改Interface Builder中的X & Y位置)。
  3. 搜索欄左下方的黑線(請參閱右圖)。爲了隱藏它,我放置了一個高度爲1px的附加視圖和一個白色背景。

對我來說這看起來有點髒,所以如果你有更好的解決方案,讓我知道。

screenshot

+0

+1簡單和乾淨。將您的按鈕和搜索欄嵌入到UIToolbar中。 – Marco 2012-01-20 19:27:06

3

回答在座的一個老問題,但我用這一個我最近掙扎,發現了一些不足之處與其他答案的情況下,我試圖解決的問題。這裏是我在UISearchBar的子類中做的:

首先添加一個UIButton屬性(這裏是「selectButton」)。然後覆蓋initWithFrame方法和做類似下面的內容:

-(id)initWithFrame:(CGRect)frame{ 
if (self = [super initWithFrame:frame]) 
{ 
    self.selectButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    self.selectButton.contentEdgeInsets = (UIEdgeInsets){.left=4,.right=4}; 
    [self.selectButton addTarget:self action:@selector(pressedButton:) forControlEvents:UIControlEventTouchUpInside]; 

    self.selectButton.titleLabel.numberOfLines = 1; 
    self.selectButton.titleLabel.adjustsFontSizeToFitWidth = YES; 
    self.selectButton.titleLabel.lineBreakMode = UILineBreakModeClip; 

    [self addSubview:self.selectButton]; 
    [self.selectButton setFrame:CGRectMake(5, 6, 60, 31)]; 
} 

return self; 
} 

現在要覆蓋佈局子視圖的方法來搜索欄調整到合適的寬度,這取決於取消按鈕是否被顯示。應該看起來像這樣:

-(void)layoutSubviews 
{ 
[super layoutSubviews]; 

float cancelButtonWidth = 65.0; 
UITextField *searchField = [self.subviews objectAtIndex:1]; 

if (self.showsCancelButton == YES) 
    [searchField setFrame:CGRectMake(70, 6, self.frame.size.width - 70 - cancelButtonWidth, 31)]; 
else 
    [searchField setFrame:CGRectMake(70, 6, self.frame.size.width - 70, 31)]; 
} 

請注意,在上面的方法中,我爲cancelButtonWidth添加了一個常量。我試圖添加代碼來獲取[self cancelButton]的寬度,但似乎只能在運行時訪問,並且不允許項目編譯。在任何情況下,這應該是您需要的良好開端

16

您可以替換書籤圖像,並根據需要調整它的偏移量。
例如:

[self.searchDisplayController.searchBar setImage:[UIImage imageNamed:@"plus2"] forSearchBarIcon:UISearchBarIconBookmark state:UIControlStateNormal]; 
[self.searchDisplayController.searchBar setPositionAdjustment:UIOffsetMake(-10, 0) forSearchBarIcon:UISearchBarIconBookmark]; 

處理的委託方法的按鈕事件:

- (void)searchBarBookmarkButtonClicked:(UISearchBar *)searchBar

這是它的外觀:

​​3210

0

如果你想有一個自定義按鈕在右側,取代Cancel按鈕,只要使用這個代碼(有效的iOS 9及以上):

[self.searchBar setShowsCancelButton:YES]; 
[[UIBarButtonItem appearanceWhenContainedIn:[self.searchBar class], nil] setTitle:@""]; 
[[UIBarButtonItem appearanceWhenContainedIn:[self.searchBar class], nil] setImage:[UIImage imageNamed:@"search"]]; 
+0

你會如何覆蓋搜索欄取消方法? – Matt 2017-09-30 20:08:39

+0

請看看這個答案:https://stackoverflow.com/questions/13799074/how-to-override-the-cancel-button-in-the-uisearchbar – Winston 2017-10-06 15:22:15

0

與來自先前答案一些啓示我已發現爲iOS 9和上面的清潔方法,包括:在水平堆疊只是地方搜索欄鑑於,讓棧做它的魔力,可以再加入儘可能多的按鈕,你喜歡向左或容易

UIStackView *searchStack = [[UIStackView alloc] initWithFrame:searchBar.frame]; 
    searchStack.axis = UILayoutConstraintAxisHorizontal; 
    UIButton *leftButton = [UIButton buttonWithType:UIButtonTypeContactAdd]; 
    [searchStack addArrangedSubview:leftButton]; 
    [searchStack addArrangedSubview:searchBar]; 
    self.tableView.tableHeaderView = searchStack;