Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 未调用UIControl子类drawInContext_Ios_Swift_Uicontrol - Fatal编程技术网

Ios 未调用UIControl子类drawInContext

Ios 未调用UIControl子类drawInContext,ios,swift,uicontrol,Ios,Swift,Uicontrol,我尝试按照本教程在iOS中构建自定义控件: 然后我想尝试@IBDesignable和@IBInspectable属性,看看实时渲染是如何工作的,所以我公开了它们。然后,我在情节提要上删除了一个UIView,并将该类更改为RangeSloider,尽管它在助理编辑器的预览模式下看起来不错,但当我在模拟器中运行它时,它实际上并不渲染两个ThumbLayer。当我在代码中设置断点时,我发现即使为自定义控件的不同层调用了setNeedsDisplay,实际的drawInContext方法也不会被调用。为

我尝试按照本教程在iOS中构建自定义控件:

然后我想尝试@IBDesignable和@IBInspectable属性,看看实时渲染是如何工作的,所以我公开了它们。然后,我在情节提要上删除了一个UIView,并将该类更改为RangeSloider,尽管它在助理编辑器的预览模式下看起来不错,但当我在模拟器中运行它时,它实际上并不渲染两个ThumbLayer。当我在代码中设置断点时,我发现即使为自定义控件的不同层调用了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!

在创建自定义控件的过程中,我是否缺少一些东西?如果这是一个noob问题,很抱歉。

在调用该层之前,可能会检查该层是否具有非零帧。你有没有尝试过显式地使框架成为某种东西?一个init在live preview中调用,另一个在实际应用中调用。因为你对这两个的代码是不同的,我怀疑问题就在那里。@DanZimm嗯,帧肯定是零。如果我不在IB中创建视图,而只是在viewDidLoad中创建一个框架,那么代码就可以工作。@Crystal我明白了。我不太清楚整个问题是什么-我需要一个完整的项目来处理,但也许退房可以帮助你。