美文网首页
iOS OC 利用CALayer向UIView中添加UIImag

iOS OC 利用CALayer向UIView中添加UIImag

作者: Wougle | 来源:发表于2017-07-05 16:25 被阅读0次

    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
    

    效果如图


    大家会发现,图片会被拉伸,那么我们该如何来修改呢?
    我们加载的图片并不 刚好是一个方的,为了适应这个视图,它有一点点被拉伸了。在使用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中添加UIImag

          本文链接:https://www.haomeiwen.com/subject/iluqhxtx.html