Есть ли способ изменить шрифт и цвет текста кнопки UISearchBar Cancel без подклассификации панели поиска?
Изменение цвета и стиля текста шрифта кнопки UISearchBar
Ответ 1
Вы можете изменить стиль кнопки "Отмена", изменив внешний вид UIBarButtonItem
, если он содержится в UISearchBar
.
Например,
[[UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class], nil] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
[UIColor blueColor],
UITextAttributeTextColor,
[UIColor darkGrayColor],
UITextAttributeTextShadowColor,
[NSValue valueWithUIOffset:UIOffsetMake(0, -1)],
UITextAttributeTextShadowOffset,
nil]
forState:UIControlStateNormal];
Ответ 2
Swift 3
let attributes = [
NSForegroundColorAttributeName : UIColor.white,
NSFontAttributeName : UIFont.systemFont(ofSize: 17)
]
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).setTitleTextAttributes(attributes, for: .normal)
Ответ 3
На основании ответа htinlinn это то, что я использовал в моем методе viewDidLoad
контроллера вида, используя панель поиска в iOS 7:
[[UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class], nil]
setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor whiteColor], NSForegroundColorAttributeName, nil]
forState:UIControlStateNormal];
Ответ 4
Упрощенная версия ответа @htinlinn:
let attributes = [
NSForegroundColorAttributeName : UIColor.textBlueColor,
NSFontAttributeName : UIFont.systemFontOfSize(13)
]
UIBarButtonItem.appearanceWhenContainedInInstancesOfClasses([UISearchBar.self]).setTitleTextAttributes(attributes, forState: .Normal)
Ответ 5
Для изменения кнопки отмены строки поиска вы берете объект Button и изменяете ссылку этой кнопки на свою пользовательскую кнопку.
UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(50,20,300,30)]; searchBar.delegate = self; searchBar.barStyle = UIBarStyleDefault; searchBar.showsCancelButton = YES; UIButton *cancelButton; for (id button in searchBar.subviews) { if ([button isKindOfClass:[UIButton class]]) { cancelButton=(UIButton*)button; break; } }
Ответ 6
Вы можете использовать свойство tint для поискаBar, чтобы изменить цвет searchBar, цвет кнопки отмены изменится, но в соответствии с цветом UISearchBar. Я не могу редактировать вручную. Но вы всегда можете поместить пользовательский интерфейс в конструктор интерфейса, который скроет собственную кнопку отмены. Пользователь будет использовать вашу пользовательскую кнопку в качестве кнопки отмены поиска.
Ответ 7
Быстрое решение после iOS 9.0 (путем изменения ответа htinlinn):
if #available(iOS 9.0, *) {
UIBarButtonItem.appearanceWhenContainedInInstancesOfClasses([UISearchBar.classForCoder()])
.setTitleTextAttributes([
NSFontAttributeName: UIFont.systemFontOfSize(12),
NSForegroundColorAttributeName: UIColor.blueColor(),
NSShadowAttributeName: NSShadow(color: UIColor.redColor(), offset: CGSizeMake(0, -1), blurRadius: 2)
],
forState: UIControlState.Normal)
} else {
// Link to Objective-C Method
}
И текущий метод Objective-C (UITextAttributeTextColor
устарел с iOS 7.0):
[[UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class], nil]
setTitleTextAttributes:@{
NSForegroundColorAttributeName: [UIColor blueColor],
NSFontAttributeName: [UIFont systemFontOfSize:12]}
forState:UIControlStateNormal];
Мое небольшое расширение тени, используемое в приведенном выше коде:
extension NSShadow {
convenience init(color: AnyObject!, offset: CGSize, blurRadius: CGFloat) {
self.init()
self.shadowColor = color
self.shadowOffset = offset
self.shadowBlurRadius = blurRadius
}
}
Ответ 8
Если вы просто хотите изменить кнопку Отмена, вы можете сделать это:
if let cancelButton = searchBar.valueForKey("cancelButton") as? UIButton {
cancelButton.setTitle(<your_string>, forState: <UIControlState>)
cancelButton.setTitleColor(<your_uicolor>, forState: <UIControlState>)
cancelButton.setAttributedTitle(<your_nsattributedstring>, forState: <UIControlState>)
}
где searchBar
- ваш объект UISearchBar
.
Ответ 9
Swift 4
let attributes:[NSAttributedStringKey:Any] = [
NSAttributedStringKey.foregroundColor : UIColor.black,
NSAttributedStringKey.font : UIFont.systemFont(ofSize: 17)
]
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).setTitleTextAttributes(attributes, for: .normal)
Ответ 10
Более эффективное решение здесь
UIButton *cancelButton = [searchBar valueForKey:@"_cancelButton"];
[cancelButton setTitleColor:[UIColor yourColor] forState:UIControlStateNormal];
[cancelButton setTitle:@"Your Text" forState:UIControlStateNormal];
и аналогичным образом вы можете изменить другие свойства стиля и текста кнопки.
Ответ 11
Попробуйте следующее:
[[UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class], nil] setTitleTextAttributes:@{NSFontAttributeName:[UIFont fontWithName:@"SourceSansPro-Regular" size:14]} forState:UIControlStateNormal];