Добавление кнопки слева от UISearchBar - PullRequest
29 голосов
/ 14 августа 2010

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

альтернативный текст http://www.erik.co.uk/images/IMG_0008.PNG

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

Я пытался взломать в Интерфейсном Разработчике, добавив UIToolbar с кнопкой слева, но я не могу найти комбинацию стилей, где эти две строки выстраиваются правильно, чтобы создать впечатление, что они едины.Всегда есть то, что выглядит как разница в один пиксель в вертикальном выравнивании, как вы можете видеть на картинке ниже:

альтернативный текст http://www.erik.co.uk/images/verticalalignment.png

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

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

Эрик

Ответы [ 6 ]

39 голосов
/ 14 августа 2010

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

В Interface Builder:

screenshot 1

Результат:

screenshot 2

18 голосов
/ 24 января 2013

Вместо этого вы можете заменить изображение закладки и при необходимости отрегулировать его смещение.
Например:

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

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

- (void)searchBarBookmarkButtonClicked:(UISearchBar *)searchBar

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

white tinted UISearchBar with custom bookmark image

8 голосов
/ 12 декабря 2011

Первое решение - использовать UINavigationBar вместо UIToolbar, как заметил KennyTM.Но вы, возможно, не будете удовлетворены панелью навигации, как в моем случае, когда мне нужно использовать 3 кнопки (панель навигации позволяет использовать только 2 кнопки) - см. Левое изображение.Вот как я это сделал:

  1. Используйте Toolbar с 3 кнопками и Flexible Space Bar Button Item в том месте, где должна быть расположена панель поиска.
  2. Установите панель поиска на (не в) панель инструментов.Для этого в Interface Builder не перетаскивайте панель поиска на панели инструментов.Вместо этого поместите его где-нибудь поблизости, а затем переместите его на место с помощью клавиш со стрелками на клавиатуре (или изменив положение X & Y в Interface Builder).
  3. Панель поиска слева черная линия под ней (см. Справакартина).Чтобы скрыть это, я добавил один дополнительный вид с высотой 1px и белым фоном над ним.

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

screenshot

4 голосов
/ 23 декабря 2010

Самое простое решение - добавить панель поиска в ТОП вашей панели инструментов (а не в), я дам вам лучшее решение, которое я использую в моей компании 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];
3 голосов
/ 13 марта 2012

отвечая на старый вопрос здесь, но я недавно сам боролся с этим и обнаружил некоторые недостатки с другими ответами для ситуации, к которой я пытался обратиться.вот что я сделал в подклассе 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;
}

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

-(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], но он кажется доступным только во время выполнения и не позволяет проекту компилироваться.В любом случае это должно стать хорошим началом для того, что вам нужно

0 голосов
/ 11 марта 2016

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

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