免费开源的iOS开发学习平台

UIView详解:7-内容模式contentMode

视图的contentMode属性决定了边界变化和缩放操作作用到视图上产生的效果。视图在屏幕上显示后,渲染后的内容会被缓存在视图下面的层(layer)上,当视图的大小发生变化时,UIKit并不强制对视图进行重画,而是根据其contentMode属性决定如何显示缓存内容。由于这种机制的存在,当我们修改视图的大小时,可以提升性能。

1、contentMode简介

contentMode经常用于图像视图UIImageview。当希望在App中调整控件的尺寸时,务必优先考虑使用contentMode,这样做可以在视图的外观发生形变时,避免编写定制的描画代码。这是因为:每个图像视图的关联图像都由Core Animation来缓存,因此不需要编写代码就可以支持动画,即不需要再次调用drawRect:方法,从而大大提高了性能。

在开发过程中,当发生如下两种情况时,会使用到contentMode:

  • 改变frame或bounds中的高度或宽度;
  • 修改transform属性。

2、常见的contentMode

默认情况下,contentMode的值被设置为UIViewContentModelScaleToFill,意味着视图内容(一般情况下是一张图片)总是填充整个视图划定的矩形区域,有可能这张图片会被拉伸。

在实际的开发过程中,一般需要根据设计师提供的图片元素的大小,来设置视图的大小,这样能够保证显示出来的图片效果不发生变形。

常见的一些contentMode对比:

3、contentMode的设置方法

contentMode可以在Storyboard中以及代码中进行设置。

  • 使用Storyboard设置。如下图所示,选中一个视图控件,可以在右侧的选项中设置contentMode。

  • 使用代码来设置contentMode。UIView类中提供了contentMode属性,其是一个UIViewContentMode类型的变量,默认取值为UIViewContentModeScaleToFill
@property(nonatomic)    UIViewContentMode contentMode; 
typedef NS_ENUM(NSInteger, UIViewContentMode) {
    UIViewContentModeScaleToFill,
    UIViewContentModeScaleAspectFit,
    UIViewContentModeScaleAspectFill, 
    UIViewContentModeRedraw,
    UIViewContentModeCenter, 
    UIViewContentModeTop,
    UIViewContentModeBottom,
    UIViewContentModeLeft,
    UIViewContentModeRight,
    UIViewContentModeTopLeft,
    UIViewContentModeTopRight,
    UIViewContentModeBottomLeft,
    UIViewContentModeBottomRight,
};

示例代码

https://github.com/99ios/7.2.7