У меня есть решение этой проблемы. Это немного взломанный и не очень аккуратный, но это трюк.
Поскольку UISearchBar
сами не позволяет редактировать заполнитель, я поставил UITextField
под ним и отключил его от любых прикосновений, делая это:
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
if([touch.view isDescendantOfView:self.placeHolderTextField]){
return NO;
}
return YES;
}
Примечание: не забудьте включить <UIGestureRecognizerDelegate>
в вашем .h файле. Если это не работает, вы всегда можете использовать [self.view sendSubViewToBack:self.placeholderTextField];
Далее я только что установил события, на которых я хочу отобразить местозаполнитель, а когда нет. В viewDidLoad
, я просто звоню self.placeHolderTextFiew.placeholder = @"search"
И в
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
if(searchText.length > 0){
self.placeHolderTextfield.placeholder = @"";
} else{
self.placeHolderTextfield.placeholder = @"search";
}
}
Примечание снова: Убедитесь в том, чтобы включить <UISearchBarDelegate>
в вашем файле .h для того, чтобы это работало.
Я также использую tableView
, поэтому, когда вызывается метод DidSelectRowAtIndexPath
, я также устанавливаю заполнитель в пустую строку.
Надеюсь, это поможет.
не работает. – jAckOdE
Это потому, что UISearchBarTextField не является прямым подчинением панели поиска. Вы можете получить его и установить правильное выравнивание текста, идя вверх по иерархии с помощью рекурсивного поиска для класса, но это плохая практика. Если Apple снова изменит иерархию классов, она может сломаться. В любом случае он будет устанавливать только выравнивание текста во время его ввода. Заполнитель будет по-прежнему центрироваться, и значок по-прежнему будет выровнен по левому краю. – Ash
Я сделал это рекурсивно, прежде чем выкладывать subviews, а затем subviews subviews, пока не достиг текста. Но поскольку @Ash сказал, что это может сломаться в будущем. –