Ios 未调用UIControl子类drawInContext
我尝试按照本教程在iOS中构建自定义控件: 然后我想尝试@IBDesignable和@IBInspectable属性,看看实时渲染是如何工作的,所以我公开了它们。然后,我在情节提要上删除了一个UIView,并将该类更改为RangeSloider,尽管它在助理编辑器的预览模式下看起来不错,但当我在模拟器中运行它时,它实际上并不渲染两个ThumbLayer。当我在代码中设置断点时,我发现即使为自定义控件的不同层调用了setNeedsDisplay,实际的drawInContext方法也不会被调用。为了重现这一点,我创建了这两个文件,同样的事情发生了,没有调用drawInContextIos 未调用UIControl子类drawInContext,ios,swift,uicontrol,Ios,Swift,Uicontrol,我尝试按照本教程在iOS中构建自定义控件: 然后我想尝试@IBDesignable和@IBInspectable属性,看看实时渲染是如何工作的,所以我公开了它们。然后,我在情节提要上删除了一个UIView,并将该类更改为RangeSloider,尽管它在助理编辑器的预览模式下看起来不错,但当我在模拟器中运行它时,它实际上并不渲染两个ThumbLayer。当我在代码中设置断点时,我发现即使为自定义控件的不同层调用了setNeedsDisplay,实际的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!
在创建自定义控件的过程中,我是否缺少一些东西?如果这是一个noob问题,很抱歉。在调用该层之前,可能会检查该层是否具有非零帧。你有没有尝试过显式地使框架成为某种东西?一个init在live preview中调用,另一个在实际应用中调用。因为你对这两个的代码是不同的,我怀疑问题就在那里。@DanZimm嗯,帧肯定是零。如果我不在IB中创建视图,而只是在viewDidLoad中创建一个框架,那么代码就可以工作。@Crystal我明白了。我不太清楚整个问题是什么-我需要一个完整的项目来处理,但也许退房可以帮助你。