如何在iOS 8中通过外观代理设置UIButton字体?

时间:2015-04-25 07:08:33

标签: ios swift uibutton uiappearance

我尝试通过外观代理设置UIButton的字体。但它似乎没有用。这就是我的尝试。

UIButton.appearance().titleFont = UIFont(name: FONT_NAME_DEFAULT, size:20.0) UIButton.appearance().titleLabel?.font = UIFont(name: FONT_NAME_DEFAULT, size:20.0)

如何在iOS 8中通过外观代理设置UIButton字体?

编辑:在vaberer的link中找到:“我很惊讶UIButton没有任何UI_APPEARANCE_SELECTOR属性,但符合UIAppearance协议。”

5 个答案:

答案 0 :(得分:9)

主题应用程序存在同样的问题。

1。添加此扩展

// UIButton+TitleLabelFont.swift

import UIKit

extension UIButton {
    var titleLabelFont: UIFont! {
        get { return self.titleLabel?.font }
        set { self.titleLabel?.font = newValue }
    }
}

2。然后设置UIButton外观原型对象

class Theme {
    static func apply() {
       applyToUIButton()
       // ...
    }

    // It can either theme a specific UIButton instance, or defaults to the appearance proxy (prototype object) by default
    static func applyToUIButton(a: UIButton = UIButton.appearance()) {
       a.titleLabelFont = UIFont(name: FONT_NAME_DEFAULT, size:20.0)
       // other UIButton customizations
    }
}

3。删除app delegate

中的主题设置
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    Theme.apply()

    // ...

    return true
}

如果您之前正在从故事板预加载内容(lazy var VC),那么最好不要使用app委托设置覆盖初始化程序中的主题内容,如下所示:

private var _NSObject__Theme_apply_token: dispatch_once_t = 0

extension NSObject {
    override public class func initialize() {
        super.initialize()
        // see also: https://stackoverflow.com/questions/19176219/why-am-i-getting-deadlock-with-dispatch-once
        var shouldRun = false
        dispatch_once(&_NSObject__Theme_apply_token) {
            shouldRun = true
        }
        if shouldRun {
            Theme.apply()
        }
    }
}

答案 1 :(得分:2)

Barry的答案很好用,但是UIButton扩展实现已过时-您需要像这样声明var titleLabelFont

@objc dynamic var titleLabelFont: UIFont! {
    get { return self.titleLabel?.font }
    set { self.titleLabel?.font = newValue }
  }

在此处查看完整的实现:http://blog.iseinc.biz/use-uiappearance-create-ios-app-themes

答案 2 :(得分:0)

当包含在按钮中时,可以将其应用于标签:

UILabel.appearance(whenContainedInInstancesOf: [UIButton.self])
  .font = .systemFont(ofSize: 19, weight: .medium)

答案 3 :(得分:0)

使用 UIAppearance 设置 UIButton 的字体如下:

label = UILabel.appearance(whenContainedInInstancesOf: [UIButton.self])
label.font = UIFont.systemFont(ofSize: 20)

您可以在 AppDelegate 的方法 application(_:, didFinishLaunchingWithOptions:) 或任何适合为您的应用程序设置主题的地方添加上述代码。

UIViewController.viewDidLoad 中,将按钮实例的 adjustsFontForContentSizeCategorytitleLabel 属性设置为 true。

class ExampleVC: UIViewController

    @IBOutlet weak var btnOkay: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        btnOkay.titleLabel?.adjustsFontForContentSizeCategory = true
    }
}

答案 4 :(得分:-2)

您正尝试在UILabel内设置UIButton字体。由于UILabel未使用UI_APPEARANCE_SELECTOR标记。你不能这样做。

查看位于What properties can I set via an UIAppearance proxy?

的UIAppearance元素列表