Изменение цвета и стиля текста шрифта кнопки UISearchBar - программирование
Подтвердить что ты не робот

Изменение цвета и стиля текста шрифта кнопки UISearchBar

Есть ли способ изменить шрифт и цвет текста кнопки UISearchBar Cancel без подклассификации панели поиска?

4b9b3361

Ответ 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];