带有资产目录的 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 图像切片会创建奇怪的工件的主要内容,如果未能解决你的问题,请参考以下文章
带有 PDF 矢量图像的资产目录不会为 iOS 导出 @3x 分辨率
XCode images.assets 资产目录切片被忽略,图像仍然失真