如何在 iOS 7 中更改 UISearchBar 的字体大小和字体样式?
UITextField *textField = [[searchBar subviews] objectAtIndex:1];
[textField setFont:[UIFont fontWithName:@"Helvetica" size:20]];
在 iOS 6 中工作,但在 iOS 7 中崩溃
如何在 iOS 7 中更改 UISearchBar 的字体大小和字体样式?
UITextField *textField = [[searchBar subviews] objectAtIndex:1];
[textField setFont:[UIFont fontWithName:@"Helvetica" size:20]];
在 iOS 6 中工作,但在 iOS 7 中崩溃
试试这个,它适用于 iOS 5.0 及更高版本:(也适用于 iOS 7)
- (void)viewDidLoad
{
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setFont:[UIFont fontWithName:@"Helvetica" size:20]];
}
对于 iOS 8
- (void)viewDidLoad
{
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{
NSFontAttributeName: [UIFont fontWithName:@"Helvetica" size:20],
}];
}
接受的答案在 iOS 7.1 上对我不起作用。我不得不将其更改为:
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{
NSFontAttributeName: [UIFont fontWithName:@"Avenir-Heavy" size:20.],
}];
iOS 10 斯威夫特 3:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSFontAttributeName:UIFont(name: "Avenir-Heavy", size: 22)!]
appearanceWhenContainedIn:
在 iOS9 中已弃用,请使用以下内容:
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setDefaultTextAttributes:@{ NSFontAttributeName: [UIFont fontWithName:@"FontName" size:14]}];
正如rmaddy所说,您不应该依赖标准 UI 组件的私有子视图结构。这些东西会改变并使您的代码中断。您应该使用提供的 API 来执行此操作。
我认为更安全的方法是:
[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setFont:[UIFont systemFontOfSize:14]];
或者您也可以使用此示例代码:
for(UIView *subView in searchBar.subviews) {
if ([subView isKindOfClass:[UITextField class]]) {
UITextField *searchField = (UITextField *)subView;
searchField.font = [UIFont systemFontOfSize:14];
}
}
上面的代码也更安全(至少与问题中提到的代码相比),因为它没有使用.subviews
对于那些正在寻找工作 Swift 版本的人,我已经调整了这个答案。Swift 目前不支持 Objc 可变参数方法,因此不能直接与上述方法一起使用。我们可以通过创建一个不使用可变参数并调用我们需要的objective-c 类别来解决这个问题:
// UIAppearance+Swift.h
@interface UIView (UIViewAppearance_Swift)
// appearanceWhenContainedIn: is not available in Swift. This fixes that.
+ (instancetype)my_appearanceWhenContainedIn:(Class<UIAppearanceContainer>)containerClass;
@end
——</p>
// UIAppearance+Swift.m
@implementation UIView (UIViewAppearance_Swift)
+ (instancetype)my_appearanceWhenContainedIn:(Class<UIAppearanceContainer>)containerClass {
return [self appearanceWhenContainedIn:containerClass, nil];
}
@end
只要确保#import "UIAppearance+Swift.h"
在您的桥接头中。
然后只需调用:
UITextField.my_appearanceWhenContainedIn(UISearchBar.self).font = UIFont.systemFontOfSize(14.0)
在斯威夫特 5
@Piotr Tomasik 的代码在位更改后仍在 swift 5 中工作
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.font:UIFont(name: "poppins", size: 13)!]
对于 Swift 4,您需要引用NSAttributedStringKey
枚举:
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self])
.defaultTextAttributes = [NSAttributedStringKey.font.rawValue: UIFont(...)]
对我来说,这使用递归函数来查找实际的文本字段。
extension UIView {
func recursive_applyTheme_Search(
#dynamicTextStyle: NSString,
bgColor: UIColor,
cursorColor: UIColor,
textColor: UIColor,
placeholderTextColor: UIColor,
borderColor: UIColor,
borderWidth: CGFloat,
cornerRadius: CGFloat) {
for subview in self.subviews
{
if subview is UITextField {
(subview as! UITextField).applyThemeForSearchBar(
dynamicTextStyle: dynamicTextStyle,
bgColor: bgColor,
cursorColor: cursorColor,
textColor: textColor,
placeholderTextColor: placeholderTextColor,
borderColor: borderColor,
borderWidth: borderWidth,
cornerRadius: cornerRadius)
}
else { subview.recursive_applyTheme_Search(
dynamicTextStyle: dynamicTextStyle,
bgColor: bgColor,
cursorColor: cursorColor,
textColor: textColor,
placeholderTextColor: placeholderTextColor,
borderColor: borderColor,
borderWidth: borderWidth,
cornerRadius: cornerRadius) }
}
}
}