【问题标题】:Multithreaded Coregraphics Drawing with Multitouch Actions, Swift多点触控操作的多线程 Coregraphics 绘图,Swift
【发布时间】:2020-09-29 16:34:37
【问题描述】:

我正在开发一个允许多点触控输入的应用程序,但在我的 UIView 中使用 drawRect 进行绘图时遇到了问题。当不止一根手指在屏幕上时,我需要绘制一个包含所有 UITouch 输入的矩形。是否有任何最佳做法,或者有一种方法可以同时绘制多个矩形以避免一次又一次地绘制大部分屏幕?

【问题讨论】:

  • 你的标题为什么提到多线程 Core Graphics 绘图?你真的想从多个线程渲染核心图形吗?
  • 我知道 coregraphics 渲染不允许多线程,只是试图获得一种有效的方式来同时绘制多个触摸,或者至少是这样的错觉。
  • Core Graphics (CG) 确实允许您从后台线程渲染,如果您小心的话。只是不是一次有多个线程。这是不安全的 UIKit。但是,如果您要尝试编写多线程 CG 代码,您真的必须知道自己在做什么。
  • 当您说“绘制一个包含所有 UITouch 输入的矩形”时,您在此处绘制什么?你的意思是一个矩形(比如一个选择矩形)?还是您的意思是您对有界区域进行了一些修改(使其变亮或显示或类似的东西)?或者是其他东西?我怀疑这里的答案真的是“CALayer”,但我不太确定你想画什么。
  • 我最终想要的是当我在屏幕上拖动 4 个手指时,每条线同时彼此分开绘制,因此我不必重新绘制一个巨大的框并包含所有四个手指的位置。

标签: swift multithreading core-graphics multi-touch uitouch


【解决方案1】:

UIView 有一个方法setNeedsDisplay(_:) 需要一个矩形来使无效。您可以反复调用它来强制更新多个小矩形区域。系统会要求视图重新绘制这些矩形。

【讨论】:

  • 这就是问题所在,当我需要同时重绘多个矩形区域时,drawRect不允许多线程,那么如何实现呢?或者从一条线跳到另一条线的重绘速度会如此之快以至于用户不会注意到吗?
  • 系统应该重复调用你的draw(rect:)方法,每个需要更新的矩形一次。它应该发生得足够快以至于它不可见。 (实现自定义draw(rect:) 方法的要求之一是您的实现要快速
  • 自从我上次测试它已经很长时间了,所以我很高兴知道它是否改变了,但我的记忆是发送到 setNeedsDisplay(_:) 的 rect 被忽略并且 draw(rect:)与 Mac 不同,在 iOS 上总是用完整的矩形调用。
  • 和你一样,我已经很久没有和draw(rect:) 搞混了。你可能是对的。
猜你喜欢
  • 1970-01-01
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多