Подтвердить что ты не робот

Установить цвет текста и шрифт для UIDatePicker в iOS8/Swift

У меня возникли проблемы с установкой шрифта и цвета UIDatePicker. Все остальное в моем приложении было довольно просто настроить, кроме этого. Кто-нибудь знает, как это сделать? Я использую Swift для iOS8.

screenshot

4b9b3361

Ответ 1

Изменение режима даты на что-то другое, похоже, заставляет повторно рисовать с новым цветом текста.

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

Ответ 2

вам просто нужно установить 2 строки кода в viewdidLoad/viewWillAppear, где вы используете DatePicker.

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

См. Результат следующим образом:

введите описание изображения здесь

Ответ 3

попробуйте следующее:

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

Ответ 5

Я считаю, что это окончательное решение для таймеров обратного отсчета.
Это расширение ответа yildirimosman.

//text color
datePicker.setValue(UIColor.whiteColor(), forKey: "textColor")
//picker background
datePicker.subviews[0].subviews[0].backgroundColor = UIColor.clearColor() //the picker 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()

Ответ 6

API не предоставляет способ сделать это. Вы можете сделать довольно убедительную реплику самостоятельно, используя UIPickerView, а не используя UIDatePicker. Se здесь

Ответ 7

Вы можете установить значение, используя forKeyPath: "textColor". Код:

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

где datePicker - ваш объект UIDatePicker, а первый параметр - цвет, который вы хотите

Ответ 8

Я хотел сделать это, но установил его, когда кто-то установил дату, установленную до этого момента, или после этого. Мне пришлось перезагружать данные, но когда я это сделал, он установил его в текущую дату 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()
    }
}

Ответ 9

Добавление textColor и highlightsToday к пользовательским переменным помогло:

Скриншот IB

Ответ 10

Я видел проблему, с которой вы столкнулись, и имел аналогичную проблему. Использование Xcode 6.3.1 Я использовал этот код в своей работе и отлично работал:

myPicker.backgroundColor = UIColor.whiteColor()

В случае, если это помогает.

Ответ 11

Swift 4

override func layoutSubviews() {
    super.layoutSubviews()

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

Ответ 12

Единственный способ изменить шрифт UIDatePickerView (до сих пор) - это шумиха:

Вы можете изменить шрифт расширением 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

Ответ 13

Вы можете использовать расширения для получения и установки textColor, как показано ниже.

extension UIDatePicker {

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

}

И затем установите цвет:

datePicker.textColor = .red