iOS OC 利用CALayer向UIView中添加UIImage

CALayer 有一个属性叫做 contents ,这个属性的类型被定义为id,意味着它可以 是任何类型的对象。在这种情况下,你可以给 属性赋任何值,你的app 仍然能够编译通过。但是,在实践中,如果你给 赋的不是CGImage, 那么你得到的图层将是空白的。
contents 这个奇怪的表现是由Mac OS的历史原因造成的。它之所以被定义为id 类型,是因为在Mac OS系统上,这个属性对CGImage和NSImage类型的值都起作 用。如果你试图在iOS平台上将UIImage的值赋给它,只能得到一个空白的图层。 一些初识Core Animation的iOS开发者可能会对这个感到困惑。
头疼的不仅仅是我们刚才提到的这个问题。事实上,你真正要赋值的类型应该是 CGImageRef,它是一个指向CGImage结构的指针。UIImage有一个CGImage属 性,它返回一个"CGImageRef",如果你想把这个值直接赋值给CALayer
的 contents ,那你将会得到一个编译错误。因为CGImageRef并不是一个真正的 Cocoa对象,而是一个Core Foundation类型。
尽管Core Foundation类型跟Cocoa对象在运行时貌似很像(被称作toll-free bridging),他们并不是类型兼容的,不过你可以通过bridged关键字转换。如果要 给图层的寄宿图赋值,你可以按照以下这个方法:

 layer.contents = (__bridge id)image.CGImage;

我们先初始化一个UIView命名为layerView,当然你可以利用xib或者StoryBoard拖一个,因为我们已经用代码的方式建立一个图层,那我们就不需要额外的图层了。 那么我们就直接把layerView的宿主图层的 contents 属性设置成图片。

@implementation ViewController
- (void)viewDidLoad
{
  [super viewDidLoad]; //load an image
  UIImage *image = [UIImage imageNamed:@"test"];
  //add it directly to our view's layer
  self.layerView.layer.contents = (__bridge id)image.CGImage;
}
@end

效果如图


iOS OC 利用CALayer向UIView中添加UIImage_第1张图片

大家会发现,图片会被拉伸,那么我们该如何来修改呢?
我们加载的图片并不 刚好是一个方的,为了适应这个视图,它有一点点被拉伸了。在使用UIImageView 的时候遇到过同样的问题,解决方法就是把 contentMode 属性设置成更合适的值。这个方法基本和我们遇到的情况的解决方法已经接近了(你可以试一下 :) ),不过 UIView大多数视觉相关的属性比如 contentMode ,对这些属性的操作其实是对对 应图层的操作。
CALayer与 contentMode 对应的属性叫做 contentsGravity ,但是它是一个 NSString类型,而不是像对应的UIKit部分,那里面的值是枚
举。 contentsGravity 可选的常量值有以下一些:

  • kCAGravityCenter
  • kCAGravityTop
  • kCAGravityBottom
  • kCAGravityLeft
  • kCAGravityRight
  • kCAGravityTopLeft
  • kCAGravityTopRight
  • kCAGravityBottomLeft
  • kCAGravityBottomRight
  • kCAGravityResize
  • kCAGravityResizeAspect
  • kCAGravityResizeAspectFill

和 cotentMode 一样, contentsGravity 的目的是为了决定内容在图层的边界 中怎么对齐,我们将使用kCAGravityResizeAspect,它的效果等同于 UIViewContentModeScaleAspectFit, 同时它还能在图层中等比例拉伸以适应图层 的边界。

 self.layerView.layer.contentsGravity = kCAGravityResizeAspect;

效果如图


iOS OC 利用CALayer向UIView中添加UIImage_第2张图片

你可能感兴趣的:(iOS OC 利用CALayer向UIView中添加UIImage)