-
contents
是一个类型为id的属性,在iOS开发中,可以利用这个属性给CALayer
设置backing image。需要用CGImageRef类型的值给contents
赋值,不然没有效果。赋值后,CALayer
会显示一张图片
UIImage *image = [UIImage imageNamed:@"dog.JPEG"];
view.layer.contents = (__bridge id)image.CGImage; -
使用UIImageView和CALayer显示图片的时候,当frame的size和图片的size长宽比不一致的时候,就会出现图片被拉伸的情况。如下图所示
(图一)被横向拉伸的狗.JPEG
UIView
有一个命名为contentMode
的属性,可以设置图片的显示方式。对应于contentMode
,CALayer
的属性为contentsGravity
。但contentMode
是一个枚举类型,而contentsGravity
接受的是一个字符串类型,可选的常量值为kCAGravityResizeAspect
等。给contentMode
赋值UIViewContentModeScaleAspectFit
或者给contentsGravity
赋值kCAGravityResizeAspect
,就可以避免图片出现拉伸的情况。如下图
(图二)显示正常的狗.JPEG -
contentsScale
属性是支持高分辨率屏幕机制的一部分。它的默认值为1.0,即会以每个点一个像素绘制图片。如果设置成2.0,则会以每个点2个像素绘制图片。但需要注意的是,如果设置了contentMode
或者contentsGravity
为一些值时(例如kCAGravityResizeAspect
或者UIViewContentModeScaleAspectFit
),对于contentsScale
的设置会没有效果。 -
当CALayer显示的内容超过了图层本身的
frame
时,可以通过设置maskToBounds
为YES
,这样超过图层本身frame
的内容就不会显示。 -
(图三)jobs.JPEGUIImage
是一个屏幕分辨率解决方案,所以指定点来度量大小。但是一些底层的图片表示如CGImage
就会使用像素,所以要清楚在Retina设备和普通设备上,他们表现出来了不同的大小。
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 20, 200, 200)];
imageView.backgroundColor = [UIColor greenColor];
imageView.contentMode = UIViewContentModeCenter;
UIImage *image = [UIImage imageNamed:@"demo_avatar_jobs"];
imageView.image = image;
[self.view addSubview: imageView];
上面这段代码显示的效果如下图三所示
UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(50, 20, 200, 200)];
imageView.backgroundColor = [UIColor greenColor];
imageView.contentMode = UIViewContentModeCenter;
UIImage *image = [UIImage imageNamed:@"demo_avatar_jobs"];
imageView.layer.contents = (__bridge_transfer id)image.CGImage;
[self.view addSubview: imageView];
而这段代码显示的效果如下图四所示
(图四)jobs.JPEG
网友评论