为什么PNG图像在视图中的位置不同时有时会变得模糊?

7
我注意到,当使用IB将PNG图像放入视图中并/或将这些图像动画到视图周围的各个位置时,图像有时会出现轻微模糊。
在大多数情况下,我可以通过将图像位置增加0.5像素来解决模糊问题。
[lbLiteButton.layer setPosition:CGPointMake(140.5,159.5)];

有时候我需要像上面那样同时调整x和y。有时候我只需要调整x或者y。
我记得在某个地方读到过这与图像大小、核心动画的工作原理以及半像素有关...但是我找不到那篇文章了!?
使用“0.5像素”解决方案的问题在于,它对每个PNG图像都不同,具体取决于大小,因此您不能重用自定义动画,因为您必须为每个不同的图像进行自定义设置。
  1. 有没有办法确保无论我放置或动画我的图像在哪里,我都不会得到任何模糊位置?
  2. 有人有相关信息吗?
谢谢!

你的图片有什么尺寸?宽度或高度是奇数吗? - Stefan Arentz
3个回答

14

position 属性是基于视图的 anchorPoint 属性。默认情况下,锚点位于视图层的中心位置,即 (0.5, 0.5)。如果你的视图(及其层)的宽高为奇数像素,则设置整数值的 position 属性将导致视图的起始点是非整数位置,从而导致模糊效果。

为解决此问题,你可以通过确定视图期望的中心位置、减去视图宽度一半并四舍五入得到取整后的值,再加上视图宽度一半,并按照相同方式处理高度,以获得一个整数版本的 position 属性。你也可以将视图层的 anchorPoint 设置为 (0,0),并根据视图的起始点来定位视图。

这可能也与父视图的不对齐有关。要诊断此问题,你可以使用 Instruments 中的 Core Animation 工具,并选择 Color Misaligned Images 选项。该工具会为应用程序中任何非像素对齐的视图或层进行标色。


1
谢谢。是的,问题在于我的一些图像具有不均匀的像素宽高比。那些能正常工作的图像,宽高比是均匀的。将锚点更改为(0,0)可以解决问题。 此外,在图像编辑器中将图像大小调整一个像素以获得均匀的宽高比也可以解决问题。(如果您不关心像素,则很好)现在我要尝试核心动画工具。感谢您的帮助。 - Jonathan
我尝试了“颜色不对齐”选项,是的,每当我执行“CAKeyFrameAnimation”时,它会将正在动画化的视图突出显示为“不对齐”。但起始和停止位置是正确的。 - Jonathan

2

我曾经在标签中遇到模糊文本的相似情况,原因是我的标签的父视图存在亚像素偏移。因此,即使在该视图内部的位置是整数,但调整到其父级坐标时,会有半个像素或更多的偏移量,导致模糊。

如果这种情况只是偶尔发生,那可能不是这种情况。您的父视图是否在移动或者位置奇怪?我认为最好的方法是找出发生这种情况的精确情况。


1

IB存在一个错误,有时(不经常)仅仅移动元素就会使它们变得模糊 - 你最常见到的是UILabels和UIImageViews(虽然这可能只是最明显的)。我相信它与上面提到的点有关,但修复方法通常是将元素的位置(x,y)坐标设置为0,0,然后再设置回原始值。这通常可以解决问题(再次强调,这是在IB中)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接