Core Animation:使用CALayer的content

2016-02-22  本文已影响3659人  黄龙辉
  1. contents是一个类型为id的属性,在iOS开发中,可以利用这个属性给CALayer设置backing image。需要用CGImageRef类型的值给contents赋值,不然没有效果。赋值后,CALayer会显示一张图片
    UIImage *image = [UIImage imageNamed:@"dog.JPEG"];
    view.layer.contents = (__bridge id)image.CGImage;

  2. 使用UIImageView和CALayer显示图片的时候,当frame的size和图片的size长宽比不一致的时候,就会出现图片被拉伸的情况。如下图所示

    (图一)被横向拉伸的狗.JPEG
    UIView有一个命名为contentMode的属性,可以设置图片的显示方式。对应于contentModeCALayer的属性为contentsGravity。但contentMode是一个枚举类型,而contentsGravity接受的是一个字符串类型,可选的常量值为kCAGravityResizeAspect等。给contentMode赋值UIViewContentModeScaleAspectFit或者给contentsGravity赋值kCAGravityResizeAspect,就可以避免图片出现拉伸的情况。如下图
    (图二)显示正常的狗.JPEG
  3. contentsScale属性是支持高分辨率屏幕机制的一部分。它的默认值为1.0,即会以每个点一个像素绘制图片。如果设置成2.0,则会以每个点2个像素绘制图片。但需要注意的是,如果设置了contentMode或者contentsGravity为一些值时(例如kCAGravityResizeAspect或者UIViewContentModeScaleAspectFit),对于contentsScale的设置会没有效果。

  4. 当CALayer显示的内容超过了图层本身的frame时,可以通过设置maskToBoundsYES,这样超过图层本身frame的内容就不会显示。

  5. UIImage是一个屏幕分辨率解决方案,所以指定点来度量大小。但是一些底层的图片表示如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];
    上面这段代码显示的效果如下图三所示

    (图三)jobs.JPEG
    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
上一篇 下一篇

猜你喜欢

热点阅读