【问题标题】:swift UIDatePicker change font, font color, font size etcswift UIDatePicker 更改字体、字体颜色、字体大小等
【发布时间】:2016-04-19 10:52:34
【问题描述】:

我一直在尝试更改 iOS 中本机 UIDatePicker 中的字体,我做到了,但有一些不确定的细节:

我使用 UIDatePicker 的扩展来更改标签中的字体:

extension UIDatePicker {

func stylizeView(view: UIView? = nil) {
    let view = view ?? self
    for subview in view.subviews {
        if let label = subview as? UILabel {
            if let text = label.text {
                print("UIDatePicker :: sylizeLabel :: \(text)\n")

                label.font = UIFont(name: "MyriadPro-Light", size: 17)!
            }
        } else { stylizeView(subview) }
    }
}}

所以,你可以深度自定义字体:

struct DatePickerStyle {
let tintColor = UIColor(hex: 0xFFFFFF)
let font = UIFont(name: "MyriadPro-Light", size: 17)!
let fontColor = UIColor(hex: 0x000000)
let fontKern: CGFloat = 0.2
var paragraphStyle: NSMutableParagraphStyle {
    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.lineSpacing =        4
    paragraphStyle.lineHeightMultiple = 1
    paragraphStyle.alignment =          .Right
    return paragraphStyle
    }}

extension UIDatePicker {
func stylizeView(view: UIView? = nil) {
    let style = DatePickerStyle()
    let view = view ?? self
    for subview in view.subviews {
        if let label = subview as? UILabel {
            if let text = label.text {
                print("UIDatePicker :: sylizeLabel :: \(text)\n")

                let attributedString = NSMutableAttributedString(string: text)
                let attributedStringRange = NSMakeRange(0, attributedString.length)

                attributedString.addAttributes([
                    NSParagraphStyleAttributeName:  style.paragraphStyle,
                    NSFontAttributeName:            style.font,
                    NSForegroundColorAttributeName: style.fontColor,
                    NSKernAttributeName:            style.fontKern
                    ], range: attributedStringRange)

                //label.font = style.font
                label.tintColor = style.fontColor
                label.attributedText = attributedString
            }
        } else { stylizeView(subview) }
    }
}

}

扩展中的此功能在UIDatePicker的任何控制事件上实现:

datePicker.addTarget(self, action: #selector(CellWithDatePicker.updateDatePickerStyle), forControlEvents: .AllEvents)

&

func updateDatePickerStyle() {
    print(":: updateDatePickerStyle")
    datePicker.stylizeView()
}

问题一:

当我初始化 UIDatePicker 时,选择器的字体仍然是 SanFrancisco。

但是当我在 UIDatePicker 中更改值时,字体会更改为我的字体

My Font

我尝试在 UIDatePicker 生命周期的每个阶段实现 datePicker.stylizeView()self.stylizeView(),但它只能更改 DatePicker 的选定行。

问题 2:

当我在 pic.2 之后旋转 DatePicker 时,当 DatePicker 的所有标签都设置为 newFont 时,所选行之外的新标签仍然使用旧字体(SanFrancisco)。当我停止旋转 DatePicker 时,所有标签都会更新为 newFont。

enter image description here

知道怎么解决吗?

【问题讨论】:

    标签: swift uidatepicker


    【解决方案1】:

    使用间隔为 0.1 的 GCD 调用样式函数。

    例子:

    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1)
    {
      self.datePicker.stylizeView();ss
    }
    

    【讨论】:

      【解决方案2】:

      改变UIDatePickerView字体的唯一方法(直到现在)是swizzling:

      你可以通过UILabel的扩展来改变字体! (不建议这样做,但它有效!)

      import Foundation
      import UIKit
      
      public extension UILabel {
      
          @objc func setFontSwizzled(font: UIFont) {
              if self.shouldOverride() {
                  self.setFontSwizzled(font: UIFont.fontWith(style: .regular, size: 14))
              } else {
                  self.setFontSwizzled(font: font)
              }
          }
      
          private func shouldOverride() -> Bool {
              let classes = ["UIDatePicker", "UIDatePickerWeekMonthDayView", "UIDatePickerContentView"]
              var view = self.superview
              while view != nil {
                  let className = NSStringFromClass(type(of: view!))
                  if classes.contains(className) {
                      return true
                  }
                  view = view!.superview
              }
              return false
          }
      
          private static let swizzledSetFontImplementation: Void = {
              let instance: UILabel = UILabel()
              let aClass: AnyClass! = object_getClass(instance)
              let originalMethod = class_getInstanceMethod(aClass, #selector(setter: font))
              let swizzledMethod = class_getInstanceMethod(aClass, #selector(setFontSwizzled))
      
              if let originalMethod = originalMethod, let swizzledMethod = swizzledMethod {
                  // switch implementation..
                  method_exchangeImplementations(originalMethod, swizzledMethod)
              }
          }()
      
          static func swizzleSetFont() {
              _ = self.swizzledSetFontImplementation
          }
      }
      

      而要更改颜色,您只需调用以下函数:

      datePicker.setValue(UIColor.whiteColor(), forKeyPath: "textColor")
      

      如果需要重新渲染你需要调用:

      datePicker.datePickerMode = .CountDownTimer
      datePicker.datePickerMode = .DateAndTime //or whatever your original mode was
      

      【讨论】:

        猜你喜欢
        • 2014-01-19
        • 2021-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-07
        • 1970-01-01
        • 2016-03-09
        相关资源
        最近更新 更多