【问题标题】:Set text color and font for UIDatePicker in iOS8/Swift在 iOS8/Swift 中为 UIDatePicker 设置文本颜色和字体
【发布时间】:2015-04-09 15:10:15
【问题描述】:

我在尝试设置UIDatePicker fontcolor 时遇到了麻烦。除了这个之外,我的应用程序中的其他所有内容都非常容易调整。有人知道怎么做这个吗?我正在为 iOS8 使用 Swift

【问题讨论】:

  • 您最终找到解决方案了吗?
  • @denislexic 不,还没有。
  • @Fenda,如果您在下面查看我的答案,我非常肯定它会为您工作。

标签: ios swift uidatepicker


【解决方案1】:

将日期模式更改为其他内容似乎会强制使用新设置的文本颜色重新绘制。

datePicker.setValue(UIColor.whiteColor(), forKeyPath: "textColor")
datePicker.datePickerMode = .CountDownTimer
datePicker.datePickerMode = .DateAndTime //or whatever your original mode was

【讨论】:

  • 我不敢相信这是我们需要用setValue forKeypath 破解的东西。它不像我们试图用表情符号或随机的东西替换日期值。
  • 这是最好的答案。我尝试了其中的许多,一个有效的并且不会损坏选择器中的 Today 标签。
  • 如果在切换模式时使用UIDatePicker,这种方法会导致崩溃。
【解决方案2】:

您只需要在viewdidLoad / viewWillAppear 中设置两行代码,以适应您使用 DatePicker 的位置。

dobDatePicker.setValue(UIColor.whiteColor(), forKeyPath: "textColor")
dobDatePicker.setValue(false, forKey: "highlightsToday")

查看结果如下:

【讨论】:

  • @ScottyBlades 您可以从任何函数访问主调度队列;这不是为什么这段代码需要去那里(如果确实如此——我还没有测试过)。如果答案是正确的,它需要去那里因为UIKit的视图生命周期的顺序UIViewController
【解决方案3】:

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

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

import Foundation
import UIKit

public extension UILabel {
    
    @objc func setFontSwizzled(font: UIFont) {
        if self.shouldOverride() {
            self.setFontSwizzled(font: <THE UIFont FOR ALL DATEPICKERS!>)
        } 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

【讨论】:

  • 这是唯一适用于字体更改的解决方案!太棒了!以下是调用函数的顺序:let datePicker = UIDatePicker() UILabel.swizzleSetFont() datePicker.setValue(themeMacro(themeKey: "titleColor"), forKey: "textColor") datePicker.datePickerMode = .date
  • 感谢您实际回答所提出的问题。谢谢
  • 无法调用此方法...如何使用?
【解决方案4】:

我相信这是倒数计时器的最终解决方案。
这是 yildirimosman 答案的扩展。

//text color
datePicker.setValue(UIColor.whiteColor(), forKey: "textColor")
//picker background
datePicker.subviews[0].subviews[0].backgroundColor = UIColor.clearColor() //the picker's own background view
//dividers
datePicker.subviews[0].subviews[1].backgroundColor = UIColor.whiteColor()
datePicker.subviews[0].subviews[2].backgroundColor = UIColor.whiteColor()
//labels: "hours" and "min"
datePicker.subviews[0].subviews[3].setValue(UIColor.lightGrayColor(), forKey: "textColor")
datePicker.subviews[0].subviews[4].setValue(UIColor.lightGrayColor(), forKey: "textColor")
//refresh the tableview (to force initial row textColor to change to white)
datePicker.subviews[0].setNeedsLayout()
datePicker.subviews[0].layoutIfNeeded()

【讨论】:

    【解决方案5】:

    你可以使用

    datePicker.setValue(UIColor.whiteColor(), forKey: "textColor")
    datePicker.setValue(false, forKey: "highlightsToday")
    //for selector color
    datePickerView.subviews[0].subviews[1].backgroundColor = UIColor.whiteColor()
    datePickerView.subviews[0].subviews[2].backgroundColor = UIColor.whiteColor()
    

    【讨论】:

    • 查看我的其他答案以获取扩展解决方案。
    【解决方案6】:

    试试这个:

        /* set color for UIDatePicker font */
    
        //text color of today string
        self.datePicker.performSelector("setHighlightsToday:", withObject:Constants.Colors.mainHeaderColor)
    
        //text color for hoglighted color
        self.datePicker.performSelector("_setHighlightColor:", withObject:Constants.Colors.mainHeaderColor)
    
        //other text color
        self.datePicker.setValue(Constants.Colors.mainHeaderColor, forKey: "textColor")
    

    【讨论】:

      【解决方案7】:

      将 textColor 和 highlightToday 添加到用户定义的变量对我有用:

      【讨论】:

        【解决方案8】:

        斯威夫特 4

        override func layoutSubviews() {
            super.layoutSubviews()
        
            datePickerView.setValue(UIColor.white, forKeyPath: "textColor")
        }
        

        【讨论】:

          【解决方案9】:

          API 不提供执行此操作的方法。您可以使用 UIPickerView 而不是使用 UIDatePicker 自己制作一个非常令人信服的副本。硒here

          【讨论】:

          • 对于其他任何东西,复制品都可以,但是对于日期?!当然不会——正如我们知道的那样,当独立开发者试图自己搞乱日期时,有很多事情可能会出错——时区更改、夏令时等...... UIDatePicker 会处理所有这些并提供可靠的 NSDate 对象。遗憾的是它没有一些基本的自定义选项。
          【解决方案10】:

          您可以使用 forKeyPath: "textColor" 设置值。代码:

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

          其中 datePicker 是你的 UIDatePicker 对象,第一个参数是你想要的颜色

          【讨论】:

            【解决方案11】:

            我想这样做,但将其设置为有人将日期设置在现在之前或之后。我不得不重新加载数据,但是当我这样做时,在使用上面的示例时,它最终将其设置为当前的 DateTime。

            所以我所做的是设置一个临时值,然后在重新加载后设置它。它确实使它产生了动画效果,但它确实有效。如果您知道更好的方法,请告诉我...

            func dateChanged(sender: UIDatePicker) {
                print(sender.date.description)
            
                let tempDate = sender.date
                let currentDate = NSDate()
            
                if originalDate.isLessThanDate(currentDate) {
                    originalDate = sender.date
                    if sender.date.isGreaterThanDate(currentDate) {
                        sender.setValue(UIColor.blackColor(), forKeyPath: "textColor")
                        sender.datePickerMode = .CountDownTimer
                        sender.datePickerMode = .DateAndTime
                        sender.date = tempDate
                        sender.reloadInputViews()
                    }
                }
            
                if sender.date.isLessThanDate(currentDate) {
                    sender.setValue(UIColor.redColor(), forKeyPath: "textColor")
                    sender.datePickerMode = .CountDownTimer
                    sender.datePickerMode = .DateAndTime
                    sender.date = tempDate
                    sender.reloadInputViews()
                }
            }
            

            【讨论】:

            【解决方案12】:

            您可以使用扩展来获取和设置 textColor,如下所示

            extension UIDatePicker {
            
                var textColor: UIColor? {
                    set {
                        setValue(newValue, forKeyPath: "textColor")
                    }
                    get {
                        return value(forKeyPath: "textColor") as? UIColor
                    }
                }
            
            }
            

            然后设置颜色:

            datePicker.textColor = .red
            

            【讨论】:

              【解决方案13】:

              这对我有用:

              为所有日期选择器子视图设置文本颜色

              for view in datePicker.subviews {
                  view.setValue(UIColor.white, forKeyPath: "textColor")
              }
              

              【讨论】:

                【解决方案14】:

                我看到了您遇到的问题并且遇到了类似的问题。使用 Xcode 6.3.1 我在我的代码中使用了这段代码并且效果很好:

                myPicker.backgroundColor = UIColor.whiteColor()
                

                如果这有帮助。

                【讨论】:

                • 这将改变选择器本身的背景颜色,而不是字体颜色的字体。就个人而言,我认为这会让这些家伙的设计看起来很糟糕。
                • 这是我需要的人。但不幸的是,你的帖子离这里太远了,我不得不在其他地方找到它。希望更多人早点看到它
                【解决方案15】:

                我在 XCode 11 上使用最新的 SwiftUI / Swift 5 时遇到了类似的问题。以上所有选项都不起作用,DatePicker 要么保持黑色文本,要么崩溃。

                在您的 SwiftUI 文件中,在 var body 之前设置 init()

                init() {
                    UIDatePicker.appearance().backgroundColor = .clear
                }
                

                然后在您的 var 正文视图中执行此操作

                DatePicker(selection: $dob, in: ...Date(), displayedComponents: .date) {
                   Text("Select Date")
                }.colorInvert()
                

                使用 iOS 深色主题将黑色文本反转为白色。看起来/效果很好。希望这会有所帮助。

                【讨论】:

                  【解决方案16】:

                  在 Xcode 11.5、iOS 13 中,模式是自动设置的,方法是在情节提要中设置日期选择器颜色,如下所示:

                  背景:systemBackgroundColor 文字:标签颜色

                  这会导致以下结果:

                  发现我还得在模拟器设置中设置界面样式:

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-01-19
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多