无法删除然后更新 Swift UIBezierPath 情节



在我的应用程序中,viewdidLoad()使用UIBezierPath来显示绿色的UIBezierPath标绘线。
但是在程序的后面,一个事件回调使用相同的UIBezierPath来removeAllPoints并在绿线旁边显示红线。
但是,它所做的只是在相同的位置将绿线变为红色。

最后,我想使用UIBezierPath来每秒钟显示一个不断变化的多线情节——即:删除以前的多行图,并显示更新的多行图,每秒钟。

代码显示了绿线 ...................

var sensor_plot_UIBezierPath = UIBezierPath()
var sensor_plot_CAShapeLayer = CAShapeLayer()
override func viewDidLoad() 
{
sensor_plot_UIBezierPath.move(to: CGPoint(  x: 100, 
y: 100))
sensor_plot_UIBezierPath.addLine( to: CGPoint(  x:  200,
y:  200 ) )
init_app_display()
...start background events...
}
func init_app_display()
{
sensor_plot_CAShapeLayer.path = sensor_plot_UIBezierPath.cgPath
sensor_plot_CAShapeLayer.fillColor = UIColor.clear.cgColor       // doesn't matter
sensor_plot_CAShapeLayer.strokeColor = UIColor.green.cgColor
sensor_plot_CAShapeLayer.lineWidth = 3.0
view.layer.addSublayer( sensor_plot_CAShapeLayer )
}

代码应该在它旁边显示红线.................
(但实际上在相同位置将初始绿线变为红色——第一行旁边没有第二行)

...display_plot_update() is called by event from background thread (specifically, BLE event didUpdateValueFor)
func display_plot_update()
{
DispatchQueue.main.async
{
self.sensor_plot_UIBezierPath.removeAllPoints()
self.sensor_plot_UIBezierPath.move(to: CGPoint(     x: 110, 
y: 100))
self.sensor_plot_UIBezierPath.addLine( to: CGPoint(  x:  210,
y:  200 ) )
self.sensor_plot_CAShapeLayer.strokeColor = UIColor.red.cgColor
}
}

你没有显示在形状层中安装路径的代码,也没有显示将形状层安装为视图控制器视图的子层的代码。你应该展示代码,这样我们就能看到你在做什么。您还应该显示init_app_display()函数的代码。

我假设你在某个地方有这样的代码:

sensor_plot_CAShapeLayer.path = self.sensor_plot_UIBezierPath.cgPath

和类似

的代码
view.layer.addSublayer(sensor_plot_CAShapeLayer)

你似乎认为将CAShapeLayer的路径设置为特定的bezier路径会将形状层链接到该路径,而更新路径会更新形状层。事情不是这样的。更改路径后,你需要将新路径安装到你的形状图层中。

你可以像这样改变你的display_plot_update()函数:

func display_plot_update()
{
DispatchQueue.main.async
{
// Create a new bezier path.
let newPath = UIBezierPath()
newPath.move(to: CGPoint(     x: 110, 
y: 100))
newPath.addLine( to: CGPoint( x: 210,
y: 200 ) )
self.sensor_plot_CAShapeLayer.strokeColor = UIColor.red.cgColor
self.sensor_plot_CAShapeLayer.path = newPath.cgPath // The important part
}
}

这将把这条线移动到你的新坐标并使它变成红色。

如果您想在第一行旁边添加第二行,那么像这样编写您的' display_plot_update()~函数:

func display_plot_update()
{
DispatchQueue.main.async
{
// Add the new line to the existing path (without clearing it)
self.sensor_plot_UIBezierPath.move(to: CGPoint(     x: 110, 
y: 100))
self.sensor_plot_UIBezierPath.addLine( to: CGPoint( x: 210,
y: 200 ) )
self.sensor_plot_CAShapeLayer.strokeColor = UIColor.red.cgColor
sensor_plot_CAShapeLayer.path = self.sensor_plot_UIBezierPath.cgPath // The important part
}
}

注意,在一个形状层中不能有不同颜色的线条。形状层只能包含一条路径,并且它使用单一笔触颜色和单一填充颜色绘制整个路径。(笔触颜色和填充颜色可以不同,但整个路径将使用相同的颜色。)

与其尝试从路径中删除所有点并重用path对象,不如构造一个新路径。

一旦路径被绘制,它就是上下文的一部分,你不能通过改变路径来移除或改变图形。如果你想从绘图中删除某些东西,你必须擦除上下文(或它的一部分),并在擦除的地方重新绘制。

通常你把所有的东西都擦掉然后重新画。

你也不应该在viewDidLoad中绘图,视图甚至可能没有连接到绘图表面。绘图应该由视图完成,而不是视图控制器。

相关内容

  • 没有找到相关文章

最新更新