Ответ 1
Используйте панель навигации вместо панели инструментов. Установите строку поиска в виде заголовка панели навигации.
В Interface Builder
:
Результат:
Я разрываю волосы на этом. Мой клиент хочет добавить кнопку слева от строки поиска, как показано ниже:
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
Я искал вокруг и просто не могу найти ответ, но, как мы видим на скриншоте, это должно быть возможно!
Заранее благодарим вас за помощь.
Эрик
Используйте панель навигации вместо панели инструментов. Установите строку поиска в виде заголовка панели навигации.
В Interface Builder
:
Результат:
Вместо этого вы можете заменить изображение закладки и при необходимости отрегулировать его смещение.
Например:
[self.searchDisplayController.searchBar setImage:[UIImage imageNamed:@"plus2"] forSearchBarIcon:UISearchBarIconBookmark state:UIControlStateNormal];
[self.searchDisplayController.searchBar setPositionAdjustment:UIOffsetMake(-10, 0) forSearchBarIcon:UISearchBarIconBookmark];
Обработать событие кнопки в методе делегата:
- (void)searchBarBookmarkButtonClicked:(UISearchBar *)searchBar
Вот как это выглядит:
Первое решение - использовать UINavigationBar
вместо UIToolbar
, как заметил KennyTM. Но вы можете не удовлетвориться навигационной панелью, как в моем случае, когда мне нужно использовать 3 кнопки (панель навигации позволяет использовать только 2 кнопки) - см. Левое изображение. Вот как я это сделал:
Toolbar
с 3 кнопками и Flexible Space Bar Button Item
в том месте, где должна быть размещена панель поиска.Interface Builder
не перетаскивайте панель поиска на панели инструментов. Вместо этого поместите его где-то рядом, а затем переместите его на место, используя клавиши со стрелками на клавиатуре (или изменив положение X и Y в Interface Builder
).1px
и белым фоном над ним.Это выглядит немного грязно для меня, поэтому, если у вас есть лучшее решение, дайте мне знать.
Самое простое решение - добавить свой SearchBar в TOP вашей панели инструментов (не в), я даю вам лучшее решение, которое я использую в своей компании 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];
отвечая на старый вопрос здесь, но я недавно боролся с этим, и нашел некоторые недостатки с другими ответами на ситуацию, которую я пытался решить. вот что я сделал в подклассе 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 layout, чтобы изменить размер панели поиска на соответствующую ширину, в зависимости от того, отображается ли кнопка отмены. Это должно выглядеть примерно так:
-(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], но это кажется доступным только во время выполнения и не позволяет компилировать проект. В любом случае это должно быть хорошим началом для того, что вам нужно
Если вы хотите, чтобы пользовательская кнопка справа, с кнопкой Cancel
, просто используйте этот код (действительный для iOS 9 и выше):
[self.searchBar setShowsCancelButton:YES];
[[UIBarButtonItem appearanceWhenContainedIn:[self.searchBar class], nil] setTitle:@""];
[[UIBarButtonItem appearanceWhenContainedIn:[self.searchBar class], nil] setImage:[UIImage imageNamed:@"search"]];