2010-08-14 2 views
26

Я отрываю свои волосы от этого. Мой клиент хочет, чтобы добавить кнопку слева от панели поиска, как на примере ниже:Добавление кнопки слева от UISearchBar

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

Но я просто не могу понять, как это сделать. Apple, похоже, не предоставляет какой-либо документированный метод добавления пользовательских кнопок в UISearchBar, не говоря уже о левой панели поиска.

Я попытался взломать интерфейс в интерфейсе Builder, добавив UIToolbar с кнопкой влево влево, но я не могу найти ни одной комбинации стилей, в которой две линии правильно строятся, чтобы создать впечатление, что они таковы. Существует всегда то, что выглядит как один разность пикселей в вертикальном выравнивании, как вы можете видеть на картинке ниже:

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

Я искал вокруг и не могу найти ответ, но, как мы видим, со скриншота это должно быть возможно!

Заранее благодарю вас за помощь.

Erik

+0

для Swift версии 3.0: [сообщение 7203924] (https://stackoverflow.com/a/44621016/7203924) –

ответ

39

Используйте панель навигации вместо панели инструментов. Установите строку поиска в виде заголовка панели навигации.

В Interface Builder:

screenshot 1

Результат:

screenshot 2

+0

Спасибо KennyTM, отличный ответ! делает именно то, что я хочу! –

+0

@ Эрик Карлсон ... Я тоже ищу добавить кнопку для поискаБар .... –

+0

Ваша фотография мертва. Можете ли вы повторить? – Will

4

Самое простое решение, чтобы добавить SearchBar в верхней части вашей панели инструментов, (не), я даю вам лучшее решение, используемое в моей компании 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, не перетащите & откройте панель поиска на панели инструментов. Вместо этого поместите его где-то рядом, а затем переместите его на место, используя клавиши со стрелками на клавиатуре (или изменив положение X & Y в Interface Builder).
  3. Панель поиска слева черная линия под ним (см. Правое изображение). Чтобы скрыть это, я добавил один дополнительный вид с высотой 1px и на белом фоне над ним.

Это выглядит немного грязно для меня, поэтому, если у вас есть лучшее решение, дайте мне знать.

screenshot

+0

+1 для простых и чистых. Вставьте свою кнопку и панель поиска в UIToolbar. – Marco

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; 
} 

Теперь вы хотите, чтобы переопределить метод компоновки подвидов, чтобы изменить размер SearchBar к соответствующим ширинам, в зависимости от того, или не показывает кнопка отмены. Это должно выглядеть примерно так:

-(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]; 

Handle событие кнопки в методе делегата:

- (void)searchBarBookmarkButtonClicked:(UISearchBar *)searchBar

Вот как это выглядит:

white tinted UISearchBar with custom bookmark image

0

Если вы хотите пользовательская кнопка справа, состоящая из Cancel кнопки, просто используйте этот код (действительно для прошивки 9 и выше):

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

как бы вы отменили метод отмены поиска? – Matt

+0

Пожалуйста, взгляните на этот ответ: https://stackoverflow.com/questions/13799074/how-to-override-the-cancel-button-in-the-uisearchbar – Winston

0

С вдохновением из предыдущих ответов чистейшего метода я нашел для прошивки 9 и выше: только места в SearchBar в горизонтальной стопке вид и пусть стек делать это волшебство, вы можете добавить столько кнопок, как вам нравится влево или вправо легко

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; 
Смежные вопросы