在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位置,所以我认为这不是问题所在。