web-dev-qa-db-ja.com

iOS8 / SwiftでUIDatePickerのテキストの色とフォントを設定します

UIDatePickerfontおよびcolorを設定しようとして問題が発生しました。私のアプリの他のすべては、これを除いて調整するのがかなり簡単でした。誰もこれを行う方法を知っていますか? iOS8Swiftを使用しています。

screenshot

24
Fenda

日付モードを別のモードに変更すると、新しく設定されたテキストの色で強制的に再描画されるようです。

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

datePickerを使用するviewdidLoad/viewWillAppear accodingに2行のコードを設定するだけです。

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

次のような結果を参照してください。

enter image description here

12
Pravin Kamble

これを試して:

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

これがカウントダウンタイマーの決定的なソリューションだと思います。
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
ObjectiveTC

使用できます

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

TextColorとhighlightsTodayをユーザー定義変数に追加すると、私にとってはうまくいきました。

IB screenshot

4
CedricSoubrie

ForKeyPath: "textColor"を使用して値を設定できます。コード:

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

ここで、datePickerはUIDatePickerオブジェクトであり、最初のパラメーターは希望する色です

3
lborgav

APIはこれを行う方法を提供しません。 UIDatePickerを使用するのではなく、UIPickerViewを使用して、かなり説得力のあるレプリカを自分で作成できます。 Se ここ

3
David Karlsson

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
3
Aliunco

私はこれをしたかったのですが、誰かが今より前または後の日付を設定したときに設定しました。データをリロードする必要がありましたが、それを行ったときに、上記の例を使用して、現在の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()
    }
}
3
Alsop

私はあなたが抱えていた問題を見て、同様の問題を抱えていました。 Xcode 6.3.1を使用して、私はこのコードを私の中で使用し、うまくいきました。

myPicker.backgroundColor = UIColor.whiteColor()

これが役立つ場合。

1
ChallengerGuy

スイフト4

override func layoutSubviews() {
    super.layoutSubviews()

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

拡張機能を使用して、以下のようにtextColorを取得および設定できます。

extension UIDatePicker {

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

}

そして、色を設定します。

datePicker.textColor = .red
0
Omar Albeik