如果我不延迟它的执行,我在 UIView init 中的代码不起作用



我正在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()中添加约束。在这种方法中,你应用约束或做与帧相关的事情

最新更新