带有资产目录的 iOS 图像切片会创建奇怪的工件

Posted

技术标签:

【中文标题】带有资产目录的 iOS 图像切片会创建奇怪的工件【英文标题】:iOS image slicing with asset catalog creates strange artifacts 【发布时间】:2014-09-26 01:14:01 【问题描述】:

我遇到了这个奇怪但希望很简单的问题,希望得到一些帮助!

我已将资产目录中的图像切成如下所示:

然后我将此图像作为 UIImageView 的背景放在 xib 中:

这个 xib 称为“tagElement”,作为 UIScrollView 视图控制器的子视图加载:

tagElement_View * tagElement = [[tagElement_View alloc] initWithFrame:CGRectZero Delegate:self Tag:tag andIndex:tagArray.count - 1];
[scrollView addSubview:tagElement];

然后,当视图最终加载时,它看起来像这样一瞬间:

但是,这就是视图在片刻之后安定下来的:

有谁知道什么会导致图像调整大小只在片刻之后发生?

谢谢!

更新:

好的,经过几个小时的调试,我找到了解决方案。我需要在这样的完成块中将 UI 更新代码提交给主线程:

dispatch_async(dispatch_get_main_queue(), ^(void)

    //  UI Updating Code

);

虽然它可以工作,但我不确定为什么需要调用它。我从未启动另一个线程来执行后台工作,似乎我只是将这个任务放在主线程上。但这不就是任务本来要执行的线程吗?

【问题讨论】:

【参考方案1】:

在这种情况下调用dispatch_async(dispatch_get_main_queue()) 所做的是要求等待运行循环的一转。当所有绘图、布局和动画都发生时,这会让你通过当前事务的提交。这反过来又可以防止您的代码自食其力。这是一种标准技术,在像 ios 这样的系统中非常有用,在这种系统中,直到事务提交才会进行绘制。在您的情况下,它可以改善绘图;在许多情况下,它甚至可以防止发生崩溃(如这里:https://***.com/a/13907375/341994)。

【讨论】:

在此处也可以查看我的解释:apeth.com/iOSBook/ch17.html#_animation_transactions 查看该部分末尾的侧边栏框,“交易的真相”。

以上是关于带有资产目录的 iOS 图像切片会创建奇怪的工件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用通过 XCode5 资产目录的切片工具切片的图像

带有 PDF 矢量图像的资产目录不会为 iOS 导出 @3x 分辨率

XCode images.assets 资产目录切片被忽略,图像仍然失真

资产目录 ImageSet - 编辑 Contents.json

在弹出框内滚动 tableview 会创建一个工件

Golang 不能用作类型结构数组或切片文字