2016-10-28 2 views
0

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

Вот текущий метод я использую (Это, кажется, работает ... НО это не составит 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) 

} 

ответ

0

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

@IBAction func redValue(_ sender: AnyObject) { 
    yourView.backgroundColor = UIColor(colorLiteralRed: readValue/255, green: greenValue/255, blue: blueValue/255, alpha: 1) 
} 
+0

Это не сработает. Swift 3 требует использования '.layer ?.backgroundColor', прежде чем вы сможете настроить цвет. Если нет другого способа сделать это. Но это единственный способ, которым я смог заставить его работать – KSigWyatt

1

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

Метод запускается каждый раз, когда изменяется одно из полей, и вы используете его для чтения значений полей 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) 
} 

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

+0

@KSigWyatt Просто интересно, если это вам поможет. –

+0

Я решил пойти в другом направлении. – KSigWyatt