gpt4 book ai didi

ios - 重写 ViewRenderer 的 Draw 方法阻塞 UI

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:33:38 25 4
gpt4 key购买 nike

我实现了一个 Xamarin.Forms 控件。我目前遇到的问题是自定义渲染器的重写 Draw() 方法会阻塞 UI(至少对于 iOS 平台而言)。我用谷歌搜索但没有成功。是否可以在不阻塞 UI 的情况下在后台执行绘图?

下面是演示该问题的 iOS 平台简单渲染器的代码。

public class MyCustomRenderer : ViewRenderer
{
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
SetNeedsDisplay();
}

public override void Draw(CoreGraphics.CGRect rect)
{
var myControl = (MyControl)this.Element;

if (!myControl.IsRendered)
{
using (var context = UIGraphics.GetCurrentContext())
{
var token = CancellationToken.None;
var task = Task.Factory.StartNew(() => TimeConsumingRendering(context, token), token);

// task.Wait() blocks the UI but draws the desired graphics.
// When task.Wait() is commented out = the desired graphics doesn't get drawn and it doesn't block the UI
task.Wait();
}
}
}

private void TimeConsumingRendering(CGContext context, CancellationToken token)
{
try
{
for (int i = 0; i <= 100; i++)
{
token.ThrowIfCancellationRequested();
var delay = Task.Delay(50);
delay.Wait();
}

context.ScaleCTM(1f, -1f);
context.TranslateCTM(0, -Bounds.Height);
context.SetTextDrawingMode(CGTextDrawingMode.FillStroke);
context.SelectFont("Helvetica-Bold", 16f, CGTextEncoding.MacRoman);
context.SetFillColor(new CoreGraphics.CGColor(1f, 0f, 0f));
context.ShowTextAtPoint(0, 0, "Finished");
}
catch
{ }
}
}

最佳答案

看起来唯一的解决方案是将耗时的绘图和在实际控件上绘图分开。

解决办法是

  1. 在背景中生成图像(由事件触发)。并且只能在 Draw 方法中使用它。
  2. 在覆盖的 Draw 方法中使用生成的图像。

至少对我有用。

关于ios - 重写 ViewRenderer 的 Draw 方法阻塞 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36503164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com