问题
I tried to set the font of UIButton
via appearance proxy. But it doesn't seem to work. This is what I tried.
UIButton.appearance().titleFont = UIFont(name: FONT_NAME_DEFAULT, size:20.0)
UIButton.appearance().titleLabel?.font = UIFont(name: FONT_NAME_DEFAULT, size:20.0)
How to set UIButton
font via appearance proxy in iOS 8 ?
EDIT: Found in vaberer's link: "I'm surprised that UIButton doesn't have any UI_APPEARANCE_SELECTOR properties, yet conforms to the UIAppearance protocol."
回答1:
Had the same problem with a theme-able app.
1. Add this extension
// UIButton+TitleLabelFont.swift
import UIKit
extension UIButton {
var titleLabelFont: UIFont! {
get { return self.titleLabel?.font }
set { self.titleLabel?.font = newValue }
}
}
2. Then setup the UIButton
appearance prototype object
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. Drop the theme setup in app delegate
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
Theme.apply()
// ...
return true
}
If you're preloading stuff (lazy var
VCs from storyboards) earlier, it may be better to instead of using app delegate setup the theme stuff in an override initializer like so:
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()
}
}
}
回答2:
Barry's answer works great but the UIButton extension implementation is out of date - you need declare var titleLabelFont
like:
@objc dynamic var titleLabelFont: UIFont! {
get { return self.titleLabel?.font }
set { self.titleLabel?.font = newValue }
}
See full implementation here: http://blog.iseinc.biz/use-uiappearance-create-ios-app-themes
回答3:
You can apply it to the label when contained in a button:
UILabel.appearance(whenContainedInInstancesOf: [UIButton.self])
.font = .systemFont(ofSize: 19, weight: .medium)
回答4:
You are trying to set a font of UILabel
inside UIButton
. Since UILabel
is not tagged with UI_APPEARANCE_SELECTOR. You can't do it like this.
Look at the list of the UIAppearance elements at: What properties can I set via an UIAppearance proxy?
来源:https://stackoverflow.com/questions/29862179/how-to-set-uibutton-font-via-appearance-proxy-in-ios-8