我已经搜索了一段时间的答案了。 在一般的编码方面,我是一个绝对的菜鸟,但我想我会尝试一下。 我正在尝试使用3(3)个滑块(R,G,B)编写一些代码来更改视图的颜色。
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var colorView: UIView!
@IBOutlet weak var redSlider: UISlider!
@IBAction func redValueChanged(sender: UISlider) {
var red = CGFloat(sender.value)
displayColors()
}
@IBOutlet weak var greenSlider: UISlider!
@IBAction func greenValueChanged(sender: UISlider) {
var green = CGFloat(sender.value)
displayColors()
}
@IBOutlet weak var blueSlider: UISlider!
@IBAction func blueValueChanged(sender: UISlider) {
var blue = CGFloat(sender.value)
displayColors()
}
func displayColors(){
let red = CGFloat(redSlider.value)
let blue = CGFloat(blueSlider.value)
let green = CGFloat(greenSlider.value)
let color = UIColor(
red: red,
green: green,
blue: blue,
alpha: 1.0)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
colorView.backgroundColor = UIColor(red: redSlider.value, green: greenSlider.value, blue: blueSlider.value, alpha: 1.0)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
但是,我在以下一行收到错误:
colorView.backgroundColor = UIColor(red: redSlider.value, green: greenSlider.value, blue: blueSlider.value, alpha: 1.0)
错误是:
无法将“Float”类型的值转换为预期的参数类型 'CGFloat的'
我知道有一个非常简单的解决方案,但是,因为我是一个菜鸟,我无法提出解决方案。
任何帮助都将不胜感激。
答案 0 :(得分:7)
CGFloat
和Float
在技术上属于不同类型。 Swift编程语言不进行任何数值类型转换/强制。因此,您必须使用Float
上的一个构造函数明确地从CGFloat
转换为CGFloat
。
colorView.backgroundColor = UIColor(red: CGFloat(redSlider.value), green: CGFloat(greenSlider.value), blue: CGFloat(blueSlider.value), alpha: 1.0)
您可以在Numeric Type Conversion中详细了解The Swift Programming Language。
答案 1 :(得分:5)
您收到此错误,因为xxxSlider.value
的类型为Float
,而UIColor
初始化程序会为所有四个参数调用类型CGFloat
。
您可以通过将行更改为:
来兑换此错误colorView.backgroundColor = UIColor(red: CGFloat(redSlider.value), green: CGFloat(greenSlider.value), blue: CGFloat(blueSlider.value), alpha: 1.0)
但是,要实现计划的目标,还有许多问题需要解决。我将在下面介绍这些内容。
首先,您有一个@IBAction
以及一个@IBOutlet
连接到每个滑块。对于前者(行动),后者实际上并不需要。因此,删除@IBOutlet
连接(代码和连接)
@IBOutlet weak var redSlider: UISlider! // remove (also remove connection)
@IBOutlet weak var greenSlider: UISlider! // ...
@IBOutlet weak var blueSlider: UISlider! // ...
现在,在@IBAction
:s中,您定义了一个从未使用的局部变量
var red = CGFloat(sender.value) // in @IBAction func redValueChanged(...
var green = CGFloat(sender.value) // ...
var blue = CGFloat(sender.value) // ...
在目前的形式中,您不需要这些,所以也要删除它们。
相反,在类的范围内(参见下面的完整程序),声明三个类变量来保存每个幻灯片的当前值(注意:这些不是在类方法中定义的) /动作/功能)。此外,让这些类型为CGFloat
而不是Float
,因为我们用来更改背景颜色的UIColor
的初始化程序会使用CGFloat
类型的参数:
var redValue: CGFloat = 0.5 // 0.5: middle slider (init)
var greenValue: CGFloat = 0.5
var blueValue: CGFloat = 0.5
在@IBAction
闭包中,按sender.value
(包含滑块值)更改这些类变量。更新变量值后,请调用displayColors()
方法(稍后我们会查看)。
// Actions
@IBAction func redValueChanged(sender: UISlider) {
redValue = CGFloat(sender.value)
displayColors()
}
@IBAction func greenValueChanged(sender: UISlider) {
greenValue = CGFloat(sender.value)
displayColors()
}
@IBAction func blueValueChanged(sender: UISlider) {
blueValue = CGFloat(sender.value)
displayColors()
}
您的displayColors()
可以简化为:
func displayColors() {
colorView.backgroundColor = UIColor(red: redValue, green: greenValue, blue: blueValue, alpha: 1.0)
}
最后,并不是在加载ViewController时只调用一次重写方法viewDidLoad()
,因此在这种情况下,您可以将其视为ViewController的初始化器。我们唯一想做的就是设置默认颜色:RGB(0.5,0.5,0.5)=灰色。
override func viewDidLoad() {
super.viewDidLoad()
// Initial BG color (viewDidLoad() loads only once when ViewController view loads)
colorView.backgroundColor = UIColor(red: redValue, green: greenValue, blue: blueValue, alpha: 1.0)
}
我们已经完成了!
将它包装起来,您的ViewController类现在应该如下所示
import UIKit
class ViewController: UIViewController {
// Properties
var redValue: CGFloat = 0.5
var greenValue: CGFloat = 0.5
var blueValue: CGFloat = 0.5
@IBOutlet weak var colorView: UIView!
// Actions
@IBAction func redValueChanged(sender: UISlider) {
redValue = CGFloat(sender.value)
displayColors()
}
@IBAction func greenValueChanged(sender: UISlider) {
greenValue = CGFloat(sender.value)
displayColors()
}
@IBAction func blueValueChanged(sender: UISlider) {
blueValue = CGFloat(sender.value)
displayColors()
}
func displayColors() {
colorView.backgroundColor = UIColor(red: redValue, green: greenValue, blue: blueValue, alpha: 1.0)
}
override func viewDidLoad() {
super.viewDidLoad()
// Initial BG color (viewDidLoad() loads only once when ViewController view loads)
colorView.backgroundColor = UIColor(red: redValue, green: greenValue, blue: blueValue, alpha: 1.0)
}
}
运行您的应用会产生以下行为:
答案 2 :(得分:0)
在我使用Swift 4的应用程序中,我使用它将Float转换为CGFloat:
let slider = sender as? UISlider
let val = CGFloat((slider?.value)!)
然后根据需要使用变量val,在我的情况下是色调,饱和度和亮度,例如
coolButton.saturation = val