web-dev-qa-db-ja.com

UISearchBarの変更キャンセルボタンのフォントテキストの色とスタイル

検索バーをサブクラス化せずに、UISearchBarの[キャンセル]ボタンのテキストフォントと色を変更する方法はありますか?

20
Rowie Po

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];
68
htinlinn

スウィフト3

let attributes = [
    NSForegroundColorAttributeName : UIColor.white,
    NSFontAttributeName : UIFont.systemFont(ofSize: 17)
]
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).setTitleTextAttributes(attributes, for: .normal)
14

Htinlinnの回答に基づくと、これはiOS7の検索バーを使用してViewControllerのviewDidLoadメソッドで使用したものです。

[[UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class], nil]
                     setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor whiteColor], NSForegroundColorAttributeName, nil] 
                                   forState:UIControlStateNormal];
4
danielM

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)
3
Javier Cancio

キャンセルボタンを変更したいだけの場合は、次の方法で行うことができます。

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>)
}

ここで、searchBarUISearchBarオブジェクトです。

2
eMdOS

簡略化されたSwiftバージョンの@htinlinn回答:

let attributes = [
    NSForegroundColorAttributeName : UIColor.textBlueColor,
    NSFontAttributeName : UIFont.systemFontOfSize(13)
]
UIBarButtonItem.appearanceWhenContainedInInstancesOfClasses([UISearchBar.self]).setTitleTextAttributes(attributes, forState: .Normal)
1

検索バーのキャンセルボタンを変更するには、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;
   }
}
0
Manish Agrawal

SearchBarのtintプロパティを使用して、searchBarの色を変更できます。キャンセルボタンの色は変更されますが、UISearchBarの色に応じて変更されます。手動で編集することはできません。ただし、Interface Builderでいつでもカスタムを適用して、ネイティブのキャンセルボタンを非表示にすることができます。また、ユーザーはカスタムボタンをsearchBarのキャンセルボタンとして使用します。

0
Saleh

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メソッド(iOS 7.0以降、UITextAttributeTextColorは非推奨):

[[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
    }
}
0
Kádi