How to set UIButton font via appearance proxy in iOS 8?

前端 未结 4 1315
难免孤独
难免孤独 2020-12-18 11:41

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 = UI

相关标签:
4条回答
  • 2020-12-18 12:19

    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

    0 讨论(0)
  • 2020-12-18 12:28

    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()
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-18 12:33

    You can apply it to the label when contained in a button:

    UILabel.appearance(whenContainedInInstancesOf: [UIButton.self])
      .font = .systemFont(ofSize: 19, weight: .medium)
    
    0 讨论(0)
  • 2020-12-18 12:37

    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?

    0 讨论(0)
提交回复
热议问题