uisearchbarのフォントサイズを変更します
-
11-10-2019 - |
質問
フォントサイズを変更するにはどうすればよいですか 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]];
}
ありがとう
パンカジ
解決
Uisearchbarには内部にuitextfieldがありますが、アクセスするプロパティはありません。したがって、標準的な方法でそれを行う方法はありません。
しかし、それを回避するための非スタードの方法があります。 uisearchbarはuiviewから継承すると、[searchbarサブビュー]を使用してサブビューにアクセスできます。コンソールで印刷すると、サブビューがあります。これらのビューがあることがわかります。
Uisearchbarbackground、UisearchBartextfield。
したがって、フォントサイズを変更するには、それを行う必要があります
UITextField *textField = [[searchBar subviews] objectAtIndex:1];
[textField setFont:[UIFont fontWithName:@"Helvetica" size:40]];
しかし、uisearchbarが将来変更され、テキストフィールドが位置1にない場合、プログラムはクラッシュするため、サブビューでuitextfieldの位置を確認してからフォントサイズを設定する方が良いでしょう。
他のヒント
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]}];
これにより、アプリ内のすべての検索バーのサブビューを列挙することを台無しにする必要はありません。
この操作を実行するための安全な方法は次のとおりです。
for(UIView *subView in searchBar.subviews) {
if ([subView isKindOfClass:[UITextField class]]) {
UITextField *searchField = (UITextField *)subView;
searchField.font = [UIFont fontWithName:@"Oswald" size:11];
}
}
なぜこれが受け入れられている答えよりも安全なのですか? uitextfieldのインデックスに依存していないため、一定のままです。 (ループのクリーナーでもあります)
受け入れられた答えは、UisearchBarにフォントを適用する推奨方法ではありません。このアプローチを回避し、@rafalkittaまたは@josemaが提供する回答を使用する方が良いでしょう。
ただし、注意してください。これは、アプリを介してすべての検索バーに適用されます。このアプローチを特定の検索バーに適用するために: UISearchBar
と設定します defaultTextAttributes
に UITextField
以下のように
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;
KVC(Key-Value Coding)を使用してテキストフィールドを取得できます
UITextField *textField = [self.searchBar valueForKey: @"_searchField"];
[textField setTextColor:[UIColor redColor]];
[textField setFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:17.0]];
プログラムで作成された検索バーのSwift 2.0では、これを行うことができます。
override func layoutSubviews() {
super.layoutSubviews()
let textFieldInsideSearchBar = self.searchBar.valueForKey("searchField") as! UITextField
textFieldInsideSearchBar.font = UIFont.systemFontOfSize(20)
}
この場合、コードをuiviewサブクラスに入れますが、他の場所でも動作します(つまり、uiviewcontrollerからviewwillappear)
Swift 3では、これを達成できます。
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = UIFont(name: "AvenirNextCondensed-Regular", size: 17.0)
UITextField
外観は機能しません UISearchBar
sプログラムで作成されました。再帰的な回避策を使用する必要があります
- (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];
}
}
他の回答のようにプライベート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"
}
私は、プロジェクトのすべてのuisearchbarsのデフォルトフォントとして「ロボットレギュラー」を使用したかったのです。 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)
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)
}
}
そのキーで検索バーを見つけてみてください:
UITextField *searchField = [self.searchDisplayController.searchBar valueForKey:@"_searchField"];
searchField.font = [[UIFont fontWithName:@"Oswald" size:11];
完全なコードは以下にする必要があります。
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;
}
}
uisearchbarを定義またはセットアップする場所に以下のコードを追加します
swift4:
UILabel.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = UIFont.init(name: "Ubuntu-Regular", size: 16)
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = UIFont.init(name: "Ubuntu-Regular", size: 16)
目的C:
[[UILabel appearanceWhenContainedIn:[UISearchBar class], nil] setFont:[UIFont fontWithName:@"Helvetica" size:12.0]];
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setFont:[UIFont fontWithName:@"Helvetica" size:12.0]];
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