在背景中绘图

2024-02-05

我有一个 IOS 应用程序,需要更新视图以响应用户或外部事件。绘制时间可以很短也可以很长(几秒),具体取决于视图中的内容。

现在,绘图是在视图的 drawRect 方法中进行的。当绘图很长且存在大量用户交互时,应用程序将变得无响应。

当需要更新时,整个视图都需要更新。如果在绘图过程中发生更改,则重新启动绘图以考虑更改是有意义的。

我想在背景中画画。

我的问题是,在 IOS 中执行此操作的最佳机制是什么?

线程,NSOperation?

我该如何处理绘图?例如,如何在线程中获取我正在更新的视图的图形上下文?

绘图操作应该如何开始?现在我正在做setNeedsDisplay。我可以改变去做别的事情。

相关视图位于 UIScrollView 内,但没有其他用户交互。


这是一个可以开始的框架。该代码假设输出视图是 UIImageView。后台任务使用位图内存上下文为输出视图创建新图像。当后台绘制任务完成时,主线程将生成的图像分配给 UIImageView。

序列号用于在完成绘制之前丢弃过时的图像。一个可能的问题是事件来得太快以至于every图像在完成之前就已经过时了。解决这个问题留给读者作为练习。

@interface SomeClass()
@property (weak, nonatomic) IBOutlet UIImageView *someView;
@property (nonatomic) int64_t sequenceNumber;
@end

@implementation SomeClass

- (UIImage *)createImageUsingBitmapMemoryContextOfSize:(CGSize)size
{
    // create the memory bitmap context
    UIGraphicsBeginImageContext( size );
    CGContextRef context = UIGraphicsGetCurrentContext();

    // draw something
    [[UIColor blueColor] set];
    CGContextFillEllipseInRect( context, CGRectMake(0, 0, size.width, size.height) );

    // create a UIImage 
    UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    // return the image
    return( result );
}

// Note: the following function should only be called on the main thread
- (void)updateInResponseToSomeEvent
{
    self.sequenceNumber++;
    int64_t sequenceNumber = self.sequenceNumber;

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^
    {
        UIImage *image = [self createImageUsingBitmapMemoryContextOfSize:self.someView.bounds.size];
        dispatch_async( dispatch_get_main_queue(), ^
        {
            if ( sequenceNumber == self.sequenceNumber )
                self.someView.image = image;
        });
    });
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在背景中绘图 的相关文章

随机推荐

  • 使用 ASP.NET、NHibernate / Fluent NHibernate 实现最轻松的多租户

    我正在尝试在我拥有的使用 NHibernate 的 ASP NET MVC 应用程序中实现多租户 尽管我可以控制多租户数据库 我正在尝试找出使用 NHibernate 过滤数据库查询的最佳方法 我想知道是否有一种轻松的方法可以附加条件 例如
  • 我需要 C# 的位操作指南/参考材料 [重复]

    这个问题在这里已经有答案了 可能的重复 最常见的 C 位运算 https stackoverflow com questions 93744 most common c bitwise operations 我正在寻找 C 的位操作参考材料
  • Python从嵌套字典中提取最大值

    我有一个以下形式的嵌套字典 2015 01 01 time 8 capacity 5 2015 01 02 time 8 capacity 7 2015 01 03 time 8 capacity 8 etc 该词典是使用 dictread
  • 如何在 ASP.NET MVC 中使用 JQuery 调用控制器操作

    我已经阅读了一段时间 发现您可以使用以下方法调用控制器操作 ajax MyController MyAction function data alert data 这是否意味着我应该添加 MicrosoftMvcAjax js 或 Micr
  • 为什么对文字使用异或而不是反转(按位非)

    我遇到过这个CRC32代码 http www opensource apple com source xnu xnu 1456 1 26 bsd libkern crc32 c很好奇为什么作者会选择使用 crc crc 0U 代替 crc
  • Excel VBA / SQL 联盟

    我正在尝试将 2 个不同工作表中的 2 个单独的列连接起来 以创建一个更长的列 然后我可以从中使用 Vlookup 表1 A B C D E F G 表2 A B C D E F G 我想将sheet1中的B列和sheet2中的C列连接 联
  • SQL 单元测试存储过程

    我是 SQL 数据库的新手 但一直面临着测试我的数据库的问题 出于安全原因 任何查询或更新都是通过存储过程完成的 一位同行建议我使用存储过程来测试其他存储过程 对于对我的存储过程进行单元测试以确保它们正在执行它们应该执行的操作 这是一个好还
  • getAttribute() 和 getParameter() 之间的区别

    有什么区别getAttribute and getParameter 内的方法HttpServletRequest class getParameter 返回http请求参数 这些从客户端传递到服务器 例如http example com
  • 应用商店中的应用大小比上传的应用大小大 7 倍

    当我将 iOS 应用程序上传到应用程序商店时 ipa 大小为32 MB 现在我的应用程序上线了 现在我在应用程序商店上检查了我的应用程序大小 它显示237 MB在 iPhone 6 上 它显示252 MB当我在电脑上的浏览器中打开应用程序链
  • 如何在 SVN 中进行独占结帐?

    我正在寻找一种从 SVN 进行独家结帐的方法 有没有办法在检出文件时自动锁定文件 如果一个用户进行独占签出 然后另一个用户对同一文件进行签出 我如何向第二个用户生成某种通知或即时消息 表明该文件已锁定 您可以添加属性或自动属性svn nee
  • dplyr 计数变量的一个特定值的数量

    假设我有一个这样的数据集 id lt c 1 1 2 2 3 3 code lt c a b a a b b dat lt data frame id code I e id code 1 1 a 2 1 b 3 2 a 4 2 a 5 3
  • 在 Python 中验证 (X)HTML

    验证文档是否遵循某个 HTML 版本 最好是我可以指定 的最佳方法是什么 我希望能够知道失败发生在哪里 就像在基于 Web 的验证器中一样 但在本机 Python 应用程序中除外 PyTidyLib http countergram git
  • 将x和y轴添加到所有facet_wrap

    通常希望尽量减少绘图中的墨水 我有一个多面情节 facet wrap 并希望去除尽可能多的墨水但保持可读性 我已经按照我的意愿进行了设置 除了 x 轴和 y 轴不存在于面 子图 中 除非位于最左侧或底部 去除了这么多墨水后 我相信眼睛需要这
  • 重载解析算法中如何确定歧义?

    我试图理解重载解析方法 为什么这是模棱两可的 void func double int int double void func int double double double void main func 1 2 3 4 但这不是吗 v
  • XCode 警告:“/* 在块注释内”

    我真的很喜欢通过这样注释来临时启用和禁用代码部分 some code 注意 代替 在最后 然而 XCode 不断向我发出警告 within block comment 有没有办法 自定义禁用 特定警告 为什么 我会告诉你为什么 因为我可以轻
  • 如何将 std::max_element 用于结构

    我想用std max element对于结构体VAR T基于id元素 但我无法将起始点和停止点与该函数的输入链接起来 typedef struct VAR int id char b 16 VAR int a 0 strcpy b VAR
  • 如何从警报框中获取文本?

    我需要从警报框中获取文本 我没有足够的声誉来上传图像 所以我上传代码而不是图像 有没有办法使用 Greasemonkey 在 Chrome 上 从弹出窗口 获取文本 查询不清楚 但是如果我理解正确的话 页面上有一个 JavaScript 会
  • JRHtmlExporter 现已弃用。如何定义图片保存路径?

    The JRHtml导出器类现在已弃用 JasperReports 6 x 我将这个类的用法替换为Html导出器 但我找不到等效的函数来替换exporter setParameter JRHtmlExporterParameter IMAG
  • Summernote 图像上传和替代方案不起作用

    我在我的网站上使用 Summernote 编辑器 并使用其网站上提到的 Click2edit 方法实现它here http www usrtriton nl assets bower summernote example html 然而 如
  • 在背景中绘图

    我有一个 IOS 应用程序 需要更新视图以响应用户或外部事件 绘制时间可以很短也可以很长 几秒 具体取决于视图中的内容 现在 绘图是在视图的 drawRect 方法中进行的 当绘图很长且存在大量用户交互时 应用程序将变得无响应 当需要更新时