Изменение цвета NSView

Я создаю простой пользовательский NSView, который позволяет пользователю вводить 3 текстовых поля для значений R, G и B соответственно. Я уже ссылался на этот вопрос и набор ответов здесь - он составляет только до Swift 2.0. Итак, кто-нибудь знает правильную технику получения такого же эффекта в Swift 3.0? Кажется, я не могу заставить все, что я делаю, работать. Я продолжаю получать ошибки всех видов.

Вот текущий метод, который я использую (кажется, он работает... НО он не будет учитывать другие 2 значения RGB, поскольку он используется в @IBAction):

//viewDidLoad
RVCustomView.wantsLayer = true

@IBAction func redValue(_ sender: AnyObject) {
    print(red.stringValue)

    var rValue = 0
    let str = red.stringValue
    if let n = NumberFormatter().number(from: str) {
        rValue = Int(CGFloat(n))
    }

    CustomNSView.layer?.backgroundColor = CGColor(red: rValue, green: 255, blue: 255, alpha: 255)

}

person KSigWyatt    schedule 28.10.2016    source источник


Ответы (2)


Если вы хотите динамически изменять цвет фона NSView каждый раз, когда изменяется значение одного из трех текстовых представлений R, G, B, вы можете использовать метод controlTextDidChange(notification:) делегата NSTextField в сочетании с выходами для каждого из трех текстовых полей.

Метод запускается каждый раз, когда изменяется одно из полей, и вы используете его для чтения значения полей RGB (через выходы) и соответствующим образом меняете цвет.

 override func controlTextDidChange (notification: NSNotification?) {
    // assuming the text fields' value is between 0 and 255
    guard 
        let redValue = Float(redOutlet.stringValue),
        let greenValue = Float(greenOutlet.stringValue),
        let blueValue = Float(blueOutlet.stringValue)

        else { return }

     CustomNSView.layer?.backgroundColor = CGColor(red: CGFloat(redValue/255), green: CGFloat(greenValue/255), blue: CGFloat(blueValue/255), alpha: 255)
 }

Примечание: не забудьте правильно установить делегата для каждого из трех текстовых полей!

person Bogdan Farca    schedule 31.10.2016
comment
@KSigWyatt Просто любопытно, помогает ли это вам каким-либо образом. - person Bogdan Farca; 01.11.2016
comment
Я решил пойти в другом направлении. - person KSigWyatt; 07.11.2016

Я думаю, вы можете просто сделать это:

@IBAction func redValue(_ sender: AnyObject) {
     yourView.backgroundColor = UIColor(colorLiteralRed: readValue/255, green: greenValue/255, blue: blueValue/255, alpha: 1)
}
person Kaique Pantosi D'amato    schedule 29.10.2016
comment
Так не пойдет. Swift 3 требует использования .layer?.backgroundColor, прежде чем вы сможете настроить цвет. Если нет другого способа сделать это. Но это единственный способ, которым я смог заставить его работать - person KSigWyatt; 29.10.2016