我正在Swift中构建一个颜色选择器。我有一个视图控制器,其中包含我通过代码构建的自定义视图。这种观点是";ColorWheelView";我有一个自定义的init。这个色轮显然包含了色轮和一个小圆形视图,一个可以拖动的指针来选择颜色。
正如我所说,我有这个自定义init:
init(radius: CGFloat, color: UIColor? = nil) {
self.radius = radius
self.color = color
super.init(frame: .zero)
self.backgroundColor = .systemGroupedBackground
self.translatesAutoresizingMaskIntoConstraints = false
self.clipsToBounds = false
setupGraphic()
if let color = color {
applyColor(_ color: color)
}
}
setupGraphic()
是我的视图的一种方法,我用它来创建和约束我的子视图。
color
是一个可选参数,如果我想用预先选择的颜色显示我的颜色选择器,我会将它传递给视图。如果存在颜色,我会执行applyColor
函数,该函数会进行一些小的计算,以获得指针在轮子中的位置。
我创建并定位";ColorWheelView";在我的视图控制器的CCD_ 4中。
尽管计算是可以的(我在断点处看到计算的位置是正确的(,指针仍然位于(x:0,y:0(。但是如果延迟执行applyColor
,指针将正确地更改其位置。即使我在主线程上执行它(尽管我已经在主线程中了(,指针也会正确地改变它的位置。为什么我应该添加这个延迟,或者在主线程上发送我的代码?我缺少什么?
编辑:
这里是applyColor
方法:
func applyColor(_ color: UIColor) {
var hue = CGFloat(0)
var sat = CGFloat(0)
var bri = CGFloat(0)
color.getHue(&hue, saturation: &sat, brightness: &bri, alpha: nil)
brightnessView.alpha = 1 - bri
let radius = sat / 2
let angle = (hue + cent) * (CGFloat.pi * -2)
let pos = CGPoint(x: ((radius * cos(angle)) + cent) * (self.radius * 2),
y: ((radius * sin(angle)) + cent) * (self.radius * 2))
brightnessSlider.setValue(Float(bri), animated: false)
getColor(at: getNormalizedPosition(pos))
pointerView.center = pos
}
这是因为当调用init()
方法时,您的视图并没有完全构造好。如果你在主线程中应用它(尽管你已经在主线程上了(,它会在一段延迟后应用它。。。(在延迟视图构造中,这样您的代码就可以得到正确的结果(。。主要是在layoutSubviews()
中添加约束。在这种方法中,你应用约束或做与帧相关的事情