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

问题描述 投票:23回答:13

我一直在设置UIDatePicker字体和颜色时遇到麻烦。我的应用程序中的其他所有内容都非常简单,除此之外。有人知道怎么做这个吗?我正在使用Swift for iOS8。

ios swift uidatepicker
13个回答
27
投票

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

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

3
投票

改变UIDatePicker View字体(直到现在)的唯一方法是调整:

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

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

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

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()
    }
}

如果需要重新渲染,您需要致电:

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
    }
}

1
投票

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

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

如果这有帮助。


1
投票

斯威夫特4

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

0
投票

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

myPicker.backgroundColor = UIColor.whiteColor()

然后设置颜色:

override func layoutSubviews() {
    super.layoutSubviews()

    datePickerView.setValue(UIColor.white, forKeyPath: "textColor")
}

11
投票

你需要在qazxsw poi / qazxsw poi中设置2行代码,你使用的是DatePicker。

viewdidLoad

看到这样的结果:

viewWillAppear


5
投票

试试这个:

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

5
投票

您可以使用

enter image description here

5
投票

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

    /* 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")

4
投票

添加文本颜色和高亮显示今天用户定义的变量对我有用:

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()


3
投票

API没有提供执行此操作的方法。您可以使用UIPickerView而不是使用UIDatePicker自己创建一个非常令人信服的副本。 Se //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()


3
投票

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

IB screenshot

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


3
投票

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

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

here
© www.soinside.com 2019 - 2024. All rights reserved.