Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions 4-视觉效果/4-视觉效果.md
Original file line number Diff line number Diff line change
Expand Up @@ -289,17 +289,17 @@ CALayer有一个属性叫做`mask`可以解决这个问题。这个属性本身

图4.13 使用了`mask`之后的UIImageView

CALayer蒙板图层真正厉害的地方在于蒙板图不局限于静态图。任何有图层构成的都可以作为`mask`属性,这意味着你的蒙板可以通过代码甚至是动画实时生成。
CALayer蒙板图层真正厉害的地方在于蒙板图不局限于静态图。任何可以由图层构成的东西都可以作为`mask`属性,这意味着你的蒙板可以通过代码甚至是动画实时生成。

##拉伸过滤

最后我们再来谈谈`minificationFilter`和`magnificationFilter`属性。总得来讲,当我们视图显示一个图片的时候,都应该正确地显示这个图片(意即:以正确的比例和正确的1:1像素显示在屏幕上)。原因如下:
最后我们再来谈谈`minificationFilter`和`magnificationFilter`属性。总得来讲,当我们在iOS中显示一个图片的时候,都应该以正确的尺寸显示这个图片(意即:图片的像素和屏幕上的像素是1:1的关系)。原因如下:

* 能够显示最好的画质,像素既没有被压缩也没有被拉伸。
* 能更好的使用内存,因为这就是所有你要存储的东西。
* 最好的性能表现,CPU不需要为此额外的计算。

不过有时候,显示一个非真实大小的图片确实是我们需要的效果。比如说一个头像或是图片的缩略图,再比如说一个可以被拖拽和伸缩的大图。这些情况下,为同一图片的不同大小存储不同的图片显得又不切实际
不过有时候,显示一个非真实大小的图片确实是我们需要的效果。比如说一个头像或是图片的缩略图,再比如说一个可以被拖拽和伸缩的大图。这些情况下,为同一图片的不同大小存储不同的图片副本显得又不切实际

当图片需要显示不同的大小的时候,有一种叫做*拉伸过滤*的算法就起到作用了。它作用于原图的像素上并根据需要生成新的像素显示在屏幕上。

Expand Down Expand Up @@ -427,17 +427,17 @@ iOS常见的做法是把一个空间的alpha值设置为0.5(50%)以使其看

图4.20 右边的渐隐按钮中,里面的标签清晰可见

这是由透明度的混合叠加造成的,当你显示一个50%透明度的图层时,图层的每个像素都会一般显示自己的颜色,另一半显示图层下面的颜色。这是正常的透明度的表现。但是如果图层包含一个同样显示50%透明的子图层时,你所看到的视图,50%来自子视图,25%来了图层本身的颜色,另外的25%则来自背景色。
这是由透明度的混合叠加造成的,当你显示一个50%透明度的图层时,图层的每个像素都会一半显示自己的颜色,另一半显示它下面的图层的颜色,这导致了半透明度的出现。但是如果图层包含一个同样显示50%透明的子图层时,你所看到的视图,50%来自子视图,25%来了图层本身的颜色,另外的25%则来自背景色。

在我们的示例中,按钮和表情都是白色背景。虽然他们都是50%的可见度,但是合起来的可见度是75%,所以标签所在的区域看上去就没有周围的部分那么透明。所以看上去子视图就高亮了,使得这个显示效果都糟透了。
在我们的示例中,按钮和标签都是白色背景。虽然他们都是50%的可见度,但是合起来的可见度是75%,所以标签所在的区域看上去就没有周围的部分那么透明。所以看上去子视图就高亮了,使得这个显示效果都糟透了。

理想状况下,当你设置了一个图层的透明度,你希望它包含的整个图层树像一个整体一样的透明效果。你可以通过设置Info.plist文件中的`UIViewGroupOpacity`为YES来达到这个效果,但是这个设置会影响到这个应用,整个app可能会受到不良影响。如果`UIViewGroupOpacity`并未设置,iOS 6和以前的版本会默认为NO(也许以后的版本会有一些改变)。

另一个方法就是,你可以设置CALayer的一个叫做`shouldRasterize`属性(见清单4.7)来实现组透明的效果,如果它被设置为YES,在应用透明度之前,图层及其子图层都会被整合成一个整体的图片,这样就没有透明度混合的问题了(如图4.21)。

为了启用`shouldRasterize`属性,我们设置了图层的`rasterizationScale`属性。默认情况下,所有图层拉伸都是1.0, 所以如果你使用了`shouldRasterize`属性,你就要确保你设置了`rasterizationScale`属性去匹配屏幕,以防止出现Retina屏幕像素化的问题。
除了启用`shouldRasterize`属性外,我们还设置了图层的`rasterizationScale`属性。默认情况下,所有图层拉伸都是1.0, 所以如果你使用了`shouldRasterize`属性,你就要确保你设置了`rasterizationScale`属性去匹配屏幕,以防止出现Retina屏幕像素化的问题。

当`shouldRasterize`和`UIViewGroupOpacity`一起的时候,性能问题就出现了(我们在第12章『速度』和第15章『图层性能』将做出介绍),但是性能碰撞都本地化了(译者注:这句话需要再翻译)。
当`shouldRasterize`和`UIViewGroupOpacity`一起的时候,性能问题就出现了(我们在第12章『速度』和第15章『图层性能』将做出介绍),但是性能影响都本地化了(译者注:这句话需要再翻译)。

清单4.7 使用`shouldRasterize`属性解决组透明问题

Expand Down