在 iOS8/Swift 中为 UIDatePicker 设置文本颜色和字体

Posted

技术标签:

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

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

【问题讨论】:

可能重复 - ***.com/questions/10844675/… 您最终找到解决方案了吗? @denislexic 不,还没有。 @Fenda,如果您在下面查看我的答案,我非常肯定它会为您工作。 【参考方案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()
    

【讨论】:

我应该注意我正在使用这里找到的比较扩展:***.com/questions/26198526/…【参考方案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 文字:标签颜色

这会导致以下结果:

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

【讨论】:

以上是关于在 iOS8/Swift 中为 UIDatePicker 设置文本颜色和字体的主要内容,如果未能解决你的问题,请参考以下文章

如何使用点击手势(iOS8 / Swift)在 pageViewController 上显示/隐藏状态栏

无法在 CoreData 子类中创建新属性? iOS8 Swift3

MPMoviePlayerDidExitFullscreenNotification 问题 - iOS8 - swift

UITableViewCell 图像在上下滚动后发生变化,但 TextLabel 文本保持不变(iOS8,Swift)

在 iOS8 Swift 中对齐左 AlertView 消息

iOS8/Swift 奇怪的空行为与来自 REST 服务的响应