我试图按照本教程在iOS中构建自定义控件:http://www.raywenderlich.com/36288/how-to-make-a-custom-control
然后我想试用@IBDesignable和@IBInspectable属性来查看实时渲染是如何工作的,所以我暴露了它们。然后我在我的故事板上删除了一个UIView,并将类更改为RangeSlider,虽然它在助理编辑器的预览模式下看起来没问题,但是当我在模拟器中运行它时,它实际上并不渲染两个thumbLayers。当我在代码中设置断点时,我看到即使为自定义控件的不同层调用了setNeedsDisplay,也从不调用实际的drawInContext方法。为了尝试重现这个,我创建了这两个文件,同样的事情发生了,没有调用drawInContext。
TestControl.swift
import UIKit
@IBDesignable
class TestControl: UIControl {
@IBInspectable var cornerRadius: CGFloat = 3.0 {
didSet {
updateLayerFrames()
}
}
let testLayer = TestLayer()
override var frame: CGRect {
didSet {
updateLayerFrames()
}
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
// testLayer.contentsScale = UIScreen.mainScreen().scale
// layer.addSublayer(testLayer)
}
override init(frame: CGRect) {
super.init(frame: frame)
testLayer.contentsScale = UIScreen.mainScreen().scale
layer.addSublayer(testLayer)
}
func updateLayerFrames() {
CATransaction.begin()
CATransaction.setDisableActions(true)
testLayer.setNeedsDisplay()
CATransaction.commit()
}
}
TestLayer.swift
import UIKit
import QuartzCore
class TestLayer: CALayer {
override func drawInContext(ctx: CGContext!) {
println("test test")
}
}
ViewController.swift
@IBOutlet var testControl: TestControl!
我是否对创建自定义控件的过程缺少了什么?对不起,如果这是一个菜鸟问题。