25

如何在 iOS 7 中更改 UISearchBar 的字体大小和字体样式?

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

在 iOS 6 中工作,但在 iOS 7 中崩溃

4

9 回答 9

67

试试这个,它适用于 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],
      }];

    }
于 2013-10-03T14:23:09.470 回答
34

接受的答案在 iOS 7.1 上对我不起作用。我不得不将其更改为:

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:@{
            NSFontAttributeName: [UIFont fontWithName:@"Avenir-Heavy" size:20.],
}];
于 2014-03-21T16:22:05.470 回答
6

iOS 10 斯威夫特 3:

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSFontAttributeName:UIFont(name: "Avenir-Heavy", size: 22)!]
于 2017-01-30T11:15:10.427 回答
2

appearanceWhenContainedIn:在 iOS9 中已弃用,请使用以下内容:

[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setDefaultTextAttributes:@{ NSFontAttributeName: [UIFont fontWithName:@"FontName" size:14]}];
于 2016-08-21T10:06:43.327 回答
1

正如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

于 2013-10-03T14:19:06.983 回答
1

对于那些正在寻找工作 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)
于 2015-02-13T17:15:52.607 回答
1

在斯威夫特 5

@Piotr Tomasik 的代码在位更改后仍在 swift 5 中工作

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.font:UIFont(name: "poppins", size: 13)!]
于 2019-05-17T06:18:35.913 回答
1

对于 Swift 4,您需要引用NSAttributedStringKey枚举:

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self])
        .defaultTextAttributes = [NSAttributedStringKey.font.rawValue: UIFont(...)]
于 2017-09-19T00:56:53.840 回答
0
  • 迅速
  • IOS 8

对我来说,这使用递归函数来查找实际的文本字段。

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

}
}
于 2015-04-12T09:37:31.723 回答