我无法弄清楚为什么我打印的for
循环和所有都在重复。
我可以宣誓在我编写for
循环之前他们没有这样做,但我尝试重新启动Xcode;将代码复制到新的游乐场;评论最后几行;和谷歌搜索 - 无济于事。
事实上,prints
在第二次被执行之前都被执行了一次,这让我觉得整个事情都被调用了两次,也许这也可以解释循环,但我只是在&#39看看会怎么样。
我正在运行Xcode 8.3.3(8E3004b)(不是开发版本)。
以下是代码,下面是我正在获取的
的屏幕截图//: I don't see why it's printing everything twice, or why the for loop is looping twice
import UIKit
import PlaygroundSupport
class CustomView: UIView {
let pathCG: [CGPoint] = [CGPoint(x:50, y:300), CGPoint(x:100, y:350), CGPoint(x:230, y:350), CGPoint(x:230, y:120)]
override func draw(_ rect: CGRect) {
print("what the hell")
print(pathCG)
print(pathCG.dropLast().count)
for v in 0...pathCG.dropLast().count {
let segAngle = vecDirCG(vec: [pathCG[v], pathCG[(v+1) % 4]]) * 180/CGFloat.pi
}
}
// MARK: get direction given two points
func vecDirCG(vec: [CGPoint]) -> CGFloat {
return atan2(-vec[1].y + vec[0].y, vec[1].x - vec[0].x)
}
}
let containerView = CustomView(frame: CGRect(x: 0, y: 0, width: 250, height: 600))
containerView.backgroundColor = UIColor.orange
PlaygroundPage.current.liveView = containerView
编辑:这是@ MohammadSadiq的答案之后的更新。它摆脱了双重打印,但双循环似乎仍然存在。但是,更改CGPoint
中pathCG
的值只会更改循环的第一个结果,而不会更改第二个结果。现在我注意到,在原始游乐场中注释掉container.backgroundColor
行已经修复了(明显的)重复执行(循环),因此我正在考虑这个问题'某种缓存问题。
答案 0 :(得分:1)
关于override func draw(_ rect: CGRect)
首次显示视图或事件时调用此方法 发生使视图的可见部分无效。
你的行
containerView.backgroundColor = UIColor.orange
可能会导致平局再次打电话。
答案 1 :(得分:1)
正如luk2302已经评论过的,在实际应用中,很难预测draw(_:)
被调用的次数或次数。游乐场不适合探索draw(_:)
的行为。
在游乐场:
import UIKit
import PlaygroundSupport
class CustomView: UIView {
let pathCG: [CGPoint] = [CGPoint(x:50, y:300), CGPoint(x:100, y:350), CGPoint(x:230, y:350), CGPoint(x:230, y:120)]
override func draw(_ rect: CGRect) {
print(pathCG)
for v in pathCG.indices {
let segAngle = vecDirCG(vec: [pathCG[v], pathCG[(v+1) % pathCG.count]]) * 180 / .pi
}
}
// MARK: get direction given two points
func vecDirCG(vec: [CGPoint]) -> CGFloat {
return atan2(-vec[1].y + vec[0].y, vec[1].x - vec[0].x)
}
}
let containerView = CustomView(frame: CGRect(x: 0, y: 0, width: 250, height: 600))
print("---------- CustomView created ----------")
containerView.backgroundColor = .orange
print("---------- backgroundColor set ----------")
PlaygroundPage.current.liveView = containerView
print("---------- liveView set ----------")
输出:
draw [(50.0, 300.0), (100.0, 350.0), (230.0, 350.0), (230.0, 120.0)] ---------- CustomView created ---------- draw [(50.0, 300.0), (100.0, 350.0), (230.0, 350.0), (230.0, 120.0)] ---------- backgroundColor set ---------- ---------- liveView set ----------
似乎draw(_:)
被调用两次,
backgroundColor
属性但你不应该认为这种行为与实际应用程序中的行为相同。
在单一视图应用中:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let containerView = CustomView(frame: CGRect(x: 0, y: 0, width: 250, height: 600))
print("---------- CustomView created ----------")
containerView.backgroundColor = .orange
print("---------- backgroundColor set ----------")
self.view!.addSubview(containerView)
print("---------- addSubview finished ----------")
}
}
class CustomView: UIView {
let pathCG: [CGPoint] = [CGPoint(x:50, y:300), CGPoint(x:100, y:350), CGPoint(x:230, y:350), CGPoint(x:230, y:120)]
override func draw(_ rect: CGRect) {
print(#function, pathCG)
for v in pathCG.indices {
let segAngle = vecDirCG(vec: [pathCG[v], pathCG[(v+1) % pathCG.count]]) * 180 / .pi
}
}
// MARK: get direction given two points
func vecDirCG(vec: [CGPoint]) -> CGFloat {
return atan2(-vec[1].y + vec[0].y, vec[1].x - vec[0].x)
}
}
输出:
在---------- CustomView created ---------- ---------- backgroundColor set ---------- ---------- addSubview finished ---------- draw [(50.0, 300.0), (100.0, 350.0), (230.0, 350.0), (230.0, 120.0)]
draw(_:)
完成后, addSubview
仅被调用一次。 (实际上,在上面的代码中,它是在viewDidLoad
完成之后调用的。)
游乐场保留了一些中间结果。对于UIView
,它会保留绘制的结果。 (这导致draw(_:)
被调用。)但是在实际应用中,这种中间结果不会被保留,因此draw(_:)
可能不会在相同的位置被调用。