web-dev-qa-db-ja.com

UISearchBarのフォントサイズを変更する

UISearchBarのフォントサイズを変更するにはどうすればよいですか?

編集:
回答

for(int i =0; i<[searchbar.subviews count]; i++) {
        if([[searchbar.subviews objectAtIndex:i] isKindOfClass:[UITextField class]])
            [(UITextField*)[searchbar.subviews objectAtIndex:i] setFont:[UIFont fontWithName:@"Helvetica" size:12]];
    }

ありがとう
パンカジ

46
pankaj

UISearchBarの内部にはUITextFieldがありますが、それにアクセスするプロパティはありません。したがって、標準的な方法でそれを行う方法はありません。

しかし、それを回避するための非標準的な方法があります。 UISearchBarはUIViewを継承し、[searchBar subviews]を使用してそのサブビューにアクセスできます。コンソールで印刷すると、サブビューであるため、これらのビューがあることがわかります。

UISearchBarBackground、UISearchBarTextField。

したがって、フォントサイズを変更するには、それを行うだけです

    UITextField *textField = [[searchBar subviews] objectAtIndex:1];
[textField setFont:[UIFont fontWithName:@"Helvetica" size:40]];

ただし、将来UISearchBarが変更され、テキストフィールドが1の位置にない場合、プログラムはクラッシュするため、サブビューでUITextFieldの位置を確認し、フォントサイズを設定することをお勧めします。

17
Bruno Domingues

IOS 5.0以降ではさらに別のオプションをお勧めします。

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setFont:[UIFont systemFontOfSize:14]];

iOS 8の場合(Mike Gledhillによるリンク):

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{
            NSFontAttributeName: [UIFont fontWithName:@"Helvetica" size:20],
      }];

iOS 9以降の場合:

[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setDefaultTextAttributes:@{NSFontAttributeName: [UIFont fontWithName:@"Helvetica" size:20]}];

この方法では、アプリのすべての検索バーのサブビューを列挙することに煩わされる必要はありません。

153

この操作を実行する安全な方法は次のとおりです。

for(UIView *subView in searchBar.subviews) {
    if ([subView isKindOfClass:[UITextField class]]) {
        UITextField *searchField = (UITextField *)subView;
        searchField.font = [UIFont fontWithName:@"Oswald" size:11];
    }
}

なぜこれが受け入れられた答えよりも安全なのですか?なぜなら、UITextFieldのインデックスが一定のままであることに依存していないからです。 (ループのクリーナーでもあります)

18
Gavin Miller

受け入れられた答えは、UISearchBarにフォントを適用する推奨方法ではありません。このアプローチを避け、@ rafalkittaまたは@josemaが提供する回答を使用することをお勧めします。

ただし、アプリ全体のすべての検索バーに適用されることに注意してください。このアプローチを特定の検索バーに適用するには、次のようにUISearchBarのサブクラスを作成し、defaultTextAttributesUITextFieldを設定します

Swift4

    let defaultTextAttribs = [NSAttributedStringKey.font.rawValue: UIFont.boldSystemFont(ofSize: 21.0), NSAttributedStringKey.foregroundColor.rawValue:UIColor.red]
    UITextField.appearance(whenContainedInInstancesOf: [CustomSearchBar.self]).defaultTextAttributes = defaultTextAttribs

Obj-C(iOS11)

    UIFont *font = [UIFont boldSystemFontOfSize:21.0];
    UIColor *color = [UIColor redColor];
    NSDictionary * defaultTextAttribs = @{NSFontAttributeName:font, NSForegroundColorAttributeName: color};
    [UITextField appearanceWhenContainedInInstancesOfClasses:@[[CustomSearchBar class]]].defaultTextAttributes = defaultTextAttribs;
15
Rishi

KVC(キー値コーディング)を使用してテキストフィールドを取得できます

UITextField *textField = [self.searchBar valueForKey: @"_searchField"];
[textField setTextColor:[UIColor redColor]];
[textField setFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:17.0]];
12
Adriano Spadoni

Swift 2.0プログラムで作成された検索バーの場合、これを行うことができます:

override func layoutSubviews() {
  super.layoutSubviews()

  let textFieldInsideSearchBar = self.searchBar.valueForKey("searchField") as! UITextField
  textFieldInsideSearchBar.font = UIFont.systemFontOfSize(20)
 }

この場合、コードをUIViewサブクラスに配置しますが、他の場所でも機能します(つまり、UIViewControllerのviewWillAppear)

11
Ciprian Rarau

Swift 3では、次の方法でこれを実現できます。

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = UIFont(name: "AvenirNextCondensed-Regular", size: 17.0)
8
Ashildr

UITextFieldの外観は、プログラムで作成されたUISearchBarsでは機能しません。再帰的な回避策を使用する必要があります

- (void)viewDidLoad {
  [super viewDidLoad];
  [self recursivelySkinTextField:self.searchBar];
}

- (void)recursivelySkinTextField:(UIView *)view {
  if (!view.subviews.count) return;

  for (UIView *subview in view.subviews) {
    if ([subview isKindOfClass:[UITextField class]]) {
      UITextField *searchField = (UITextField *)subview;
      searchField.font = [[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] font];
      searchField.textColor = [[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] textColor];
    }
    [self recursivelySkinTextField:subview];
  }
}
5
Eugene

他の回答のようにプライベートAPIを使用しないでください。アプリケーション全体で検索バーをカスタマイズする場合は、クラスの外観プロキシを使用できます。検索バーのテキスト属性、プレースホルダー属性、キャンセルボタン、テキストフィールドの背景画像、背景画像などを変更できます。使用例:

if #available(iOS 9.0, *) {
    let searchBarTextAttributes = [
        NSFontAttributeName: UIFont.boldSystemFont(ofSize: 12), 
        NSForegroundColorAttributeName: UIColor.red
    ]
    // Default attributes for search text
    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = searchBarTextAttributes

    // Attributed placeholder string
    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).attributedPlaceholder = NSAttributedString(string: "Search...", attributes: searchBarTextAttributes)

    // Search bar cancel button
    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).setTitleTextAttributes(searchBarTextAttributes, for: .normal)
    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).title = "Cancel"
}
5
rafalkitta

プロジェクトのすべてのuisearchbarsのデフォルトフォントとして「Roboto-Regular」を使用したかった。 uisearchbar拡張を作成しました。

extension UISearchBar {
func addRobotoFontToSearchBar(targetSearchBar:UISearchBar?) -> UISearchBar
{
    let textFieldInsideSearchBar = targetSearchBar!.valueForKey("searchField") as! UITextField
    textFieldInsideSearchBar.font = UIFont(name: "Roboto-Regular", size: 15.0)

//UIBarButtons font in searchbar
let uiBarButtonAttributes: NSDictionary = [NSFontAttributeName: UIFont(name: "Roboto-Regular", size: 15.0)!] 
UIBarButtonItem.appearance().setTitleTextAttributes(uiBarButtonAttributes as? [String : AnyObject], forState: UIControlState.Normal)

    return targetSearchBar!
}
}

使用法:

self.sampleSearchBar.addRobotoFontToSearchBar(sampleSearchBar)
3
A.G

Swift-関数名を変更して関数をより正確に記述しました。私の場合、フォントサイズを変更する必要がありました。

func findAndSetTextField(view: UIView) {
    if (view.subviews.count == 0){
        return
    }

    for var i = 0; i < view.subviews.count; i++ {
        var subview : UIView = view.subviews[i] as UIView
        if (subview.isKindOfClass(UITextField)){
            var searchField : UITextField = subview as UITextField
            searchField.font = UIFont(name: "Helvetica", size: 19.0)!
         }
         findAndSetTextField(subview)
    }
}
2
epaus

完全なコードは次のとおりです。

for (UIView *v in (SYSTEM_VERSION_LESS_THAN(@"7.0")?searchBar.subviews:[[searchBar.subviews objectAtIndex:0] subviews])) {

    if([v isKindOfClass:[UITextField class]]) {
        UITextField *textField = (UITextField *)v;
        [textField setFont:fREGULAR(@"15.0")];

        return;
    }
}
1
Trong Dinh

キーで検索バーを見つけてみてください:

UITextField *searchField = [self.searchDisplayController.searchBar valueForKey:@"_searchField"];
searchField.font = [[UIFont fontWithName:@"Oswald" size:11];
1
theprojectabot

Swift 4.2 +の場合

let defaultTextAttributes = [
    NSAttributedString.Key.font: UIFont.init(name: "Ubuntu-Regular", size: 16),
    NSAttributedString.Key.foregroundColor: UIColor.gray
]
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = defaultTextAttributes
0
Elliott Yang