在iOS上使用swift绘制视图后,以编程方式绘制要查看的新图层

在iOS上使用swift绘制视图后,以编程方式绘制要查看的新图层,ios,swift,Ios,Swift,我有一个UISlider,我需要在滑块的任意点上绘制它 我可以在viewDidLoad中绘制刻度线,但由于此时我还无法获得UISlider的正确边界,因此它们绘制在错误的位置。如果我在viewdilayoutsubviews中绘制它们,我确实得到了正确的边界,但不会显示记号 我试着画出以下这些标记: override func viewDidLayoutSubviews(){ super.viewDidLayoutSubviews() writeTickMarks() } fun

我有一个
UISlider
,我需要在滑块的任意点上绘制它

我可以在
viewDidLoad
中绘制刻度线,但由于此时我还无法获得
UISlider
的正确边界,因此它们绘制在错误的位置。如果我在
viewdilayoutsubviews
中绘制它们,我确实得到了正确的边界,但不会显示记号

我试着画出以下这些标记:

override func viewDidLayoutSubviews(){
    super.viewDidLayoutSubviews()
    writeTickMarks()
}
func writeTickMarks(){
    // create a vertical line
    let path = UIBezierPath()
    path.move(to: CGPoint(x: calculatedXValue, y: calculatedYValue))
    path.addLine(to: CGPoint(x: calculatedXValue, y: calculatedYValue + 5))

    // draw the vertical line in blue with a thickness of 2
    let shapeLayer = CAShapeLayer()
    shapeLayer.path = path.cgPath
    shapeLayer.strokeColor = UIColor.blue.cgColor
    shapeLayer.fillColor = UIColor.clear.cgColor
    shapeLayer.opacity = 0.5
    shapeLayer.lineWidth = 2

    // add the shape to the slider's view
    self.slider.superview?.layer.addSublayer(shapeLayer)
}
我尝试在调用
writeticmarks
后立即调用
setNeedsDisplay
layoutifneedd
上的
self.view
以及
self.slider.superview
,但这些调用似乎没有任何影响:-/


我如何以编程方式将这些新层绘制到我的
UISlider
免责声明-我无法回答当您从
viewDidLayoutSubviews
调用方法时,为什么不显示勾号,这很奇怪。但是

对于同一个概念——视图控制器生命周期,以及它何时真正理解视图的真实几何体,我有过无数次的头疼。
viewdilayoutsubviews
的问题在于,当用户界面加载时,它经常会被多次调用,这会导致Calayer被多次添加

我还有一个
CAShapeLayer
,与
UIBezierPath
一起使用。我有一个适合我的黑客解决方案

  • 我确实调用了
    viewdilayoutsubviews
    中的
    CAShapeLayer
    init方法(相当于您的
    writeckmarks()
    方法)
  • 我将我的
    CAShapeLayer
    设置为类级属性,并在每个方法调用中检查它是否为非nil:

    if self.shapeLayer != nil {
        self.shapeLayer!.removeFromSuperView()
        self.shapeLayer = nil
    }
    
    如果它不是nil,我会删除并取消分配它,以避免在每次调用
    viewdilayoutsubviews
    时添加它


  • 它的效率不是很高,但是可以绕过
    viewdilayoutsubviews
    的多次调用和
    viewdiload
    中的未知几何体

    代码应该按原样工作(并且没有setNeedsDisplay/layoutifneedd调用)。检查以确保你不仅仅是在屏幕上画东西。我自己也做过类似的事情,我计算的y值将我的点置于屏幕底部边缘以下900px。

    Wow。这正是我的问题。在我的
    viewDidLoad
    版本的代码中,我的记号被画在正确的y位置,所以我认为这不是问题所在。