`
stephen830
  • 浏览: 3011054 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

CALayers 教程:初步认识 CALayer

 
阅读更多

CALayers 教程:初步认识 CALayer

 

如果你是一个 iOS 开发者,对于 UIView 肯定不会陌生 – UIButtonUITextAreaUIWebView,这些都是 UIView 的子类。

但是你可能还不知道 UIView 是基于 CALayer 构建的!至少在很长的一段时间里我并不知道。

懂点 CALayer 的内容还是很不错的,因为你可以用它来实现一些不错的视觉效果,而且他们对于理解 Core Animation 很有帮助。

在这篇 CALayer 的教程中,我们将创建一个简单的应用,新建一个 layer 并对它的外观进行各种改动,学习 CALayer 的基本使用方法。

友情提示, CALayer 的系列教程是针对有一定 iOS 开发基础的同学们的,如果你是一个完全的新手,可以先看看这个系列的基础教程。

好的,让我们开始吧!

CALayer 是什么

简单来说,CALayer 代表的就是屏幕上的一片矩形区域。

“嗨哥们儿等下,”你可能要说,“那不是 UIView 干的事情吗!”啊哈是的没错,但是真相是:每个 UIView 都包含了一个 Root Layer 。你可以用下面这段代码获取到这个根图层:

CALayer *myLayer = myView.layer;

CALayer 有很多很多的属性,想必是极好的,你可以通过设置它的属性实现各种视觉效果,比如:

  • 调整图层的大小和位置
  • 调整图层的背景颜色
  • 修改图层的内容 (一个图片,或者是用 CoreGraphics 绘制的东西)
  • 图层是否圆角
  • 添加黑色投影
  • 添加描边的边框
  • 还有其他各种玩法!

你可以用这些属性创建一些视觉效果。比如,你想要把一张图片放在一个白色的边框里,然后再加上个黑色的阴影。不用 PS ,也不用一大串 CoreImage 的代码,只需要这么一小段代码,你就可以用 CALayer 实现!

啊哈补充一点, CALayer 的属性绝大多数都是可以做成动画效果的。举个例子,你可以让你的图像显示圆角,然后点击一个按钮,圆角又会恢复到原来方角的样子。好好利用这个特性可以做出很多精致的效果!

你可以直接使用 CALayer ,你也可以用它的子类:CAGradientLayer、CATextLayer、CAShapeLayer等等。 UIView 默认的图层类是原始的 CALayer 类。

开始动手

没什么比自己动手更好的学习方法了!打开你的 Xcode ,新建一个名为 LayerFun 的项目,项目类型是 Single View Application,这样一开始我们就有了一个空白的 UIView

现在你可以自己动手改一改这个 UIView 中 layer 的属性了:

override func viewWillAppear() {
    self.view.layer.backgroundColor = UIColor.orangeColor().CGColor
    self.view.layer.cornerRadius = 20.0
    self.view.layer.frame = CGRectInset(self.view.layer.frame, 20, 20)
}

让我们一点一点分析一下上面的代码:

  • 你可以用 self.view.layer 获取到 UIView 的图层的指针。你可以通过 self.view 获取到当前 ViewController 的根视图,你可以通过 view.layer 获取到视图的默认图层。默认情况下这个图层的类型是 CALayer (不是子类)。
  • 接下来我们把背景颜色设置成了橘黄色。注意, backgroundColor 这个属性实际上是一个 CGColor 的类型,不过把 UIColorCGColor 很容易。
  • 然后我们通过设置 cornerRadius 给图层加了圆角效果。这个值是圆角效果的圆的半径,在这里我们把它设置成了20。
  • 最后我们通过 CGRectInset 稍稍缩放一下图层的边框,这样可以更方便的展示效果。CGRectInset 函数有两个参数,一个是边框,另一个是缩放的值 (x方向 和 y方向) ,并且返回一个新的边框。

运行一下会发现屏幕中间出现一个橘黄色的长方形:



 

CALayers 和 Sublayers

就像 UIView 有很多 subview 一样, CALayer 也有 sublayer 。你可以很容易的创建一个新的 CALayer :

var sublayer = CALayer()

创建了一个新的 CALayer 之后,你可以设置它的任何属性,不过有一个是必须设置的,那就是它的 frame (或者 bounds/position) 。毕竟,所有的图层都要知道自己该有多大 (或者自己该在哪里) 。当你设置了这些基本的属性之后,你可以通过下面的代码把它加到另一个 layer 里:

self.view.layer.addSublayer(sublayer)

你可以给我们的视图的图层添加一个图层,添加如下代码:

override func viewWillAppear(animated: Bool) {

    self.view.layer.backgroundColor = UIColor.orangeColor().CGColor
    self.view.layer.cornerRadius = 20.0
    self.view.layer.frame = CGRectInset(self.view.layer.frame, 20, 20)

    var sublayer = CALayer()
    sublayer.backgroundColor = UIColor.blueColor().CGColor;
    sublayer.shadowOffset = CGSizeMake(0, 3);
    sublayer.shadowRadius = 5.0;
    sublayer.shadowColor = UIColor.blackColor().CGColor;
    sublayer.shadowOpacity = 0.8;
    sublayer.frame = CGRectMake(30, 30, 128, 192);
    self.view.layer.addSublayer(sublayer)

}

上面的代码创建了一个新的图层,并且设置了一些属性 - 包括一些设置阴影的代码,你以前可能没见过。可以看到这几行代码就添加了阴影效果,十分简单。

运行的效果是这个样子的:



 

设置 CALayer 的图片内容

CALayer 最酷的事情之一就是它可以包含除了纯色之外的东西,比如它里面可以放上一张图片。

那么接下来让我们给这个图层换上图片,你可以在这里 下载一个示例图片(附件中的05.jpg),当然也可以自己弄一张图片做测试。

把图片加到项目中,然后在把 sublayer 加到图层之前加上如下代码:

sublayer.contents = UIImage(named: "BattleMapSplashScreen")?.CGImage
sublayer.borderColor = UIColor.blackColor().CGColor
sublayer.borderWidth = 2.0

上面的代码将图层的 contents 设置成了一张图片 (代码写的十分清晰) ,然后又设置了 borderColorborderWidth ,添加了一个黑色的边框。

运行一下,你可以看到原本蓝色的背景以及不复存在,取而代之的是我们设置的图片的内容:



 

关于设置圆角和图片

设置圆角看起来非常的酷,但是如果你设置了 contents 为图片,那么图片会绘制在圆角的外面,导致圆角的设置失败。解决的方案是设置 .masksToBounds 属性为 true 。不过你如果这样设置的话,投影又不显示了,因为他们都被遮盖了!

我发现了一种折中的解决方案:创建两个图层。外围的图层是一个纯色的 CALayer 用来展示投影,里面的图层则是有圆角的图片图层:

var sublayer = CALayer()
sublayer.backgroundColor = UIColor.blueColor().CGColor
sublayer.shadowOffset = CGSizeMake(0, 3)
sublayer.shadowRadius = 5.0
sublayer.shadowColor = UIColor.blackColor().CGColor
sublayer.shadowOpacity = 0.8
sublayer.frame = CGRectMake(30, 30, 128, 192)
sublayer.borderColor = UIColor.blackColor().CGColor
sublayer.borderWidth = 2.0
sublayer.cornerRadius = 10.0
self.view.layer.addSublayer(sublayer)

var imageLayer = CALayer()
imageLayer.frame = sublayer.bounds
imageLayer.cornerRadius = 10.0
imageLayer.contents = UIImage(named:"BattleMapSplashScreen.jpg")?.CGImage
imageLayer.masksToBounds = true
sublayer.addSublayer(imageLayer)

运行的效果是这样的,既有投影,又有图片:



 

关于自定义填充内容

如果你希望通过 Core Graphics 画一些自定义的内容而不是用现成的图片的话,这也很简单。

解决的方案是给这个图层设置一个委托,需要实现一个 drawLayer:inContext 的方法。这样可以把 Core Graphics 绘制的内容显示出来。

让我们试着加一个新的图层,并且在上面绘制一些纹理式样。你可以把 ViewController 设置为图层的委托。至于怎么使用 Core Graphs ,可以参考Core Graphics 101: Patterns这篇文章。

在方法的最后加上下面这段代码:

var customDrawn = CALayer()
customDrawn.delegate = self
customDrawn.backgroundColor = UIColor.greenColor().CGColor
customDrawn.frame = CGRectMake(30, 250, 128, 40)
customDrawn.shadowOffset = CGSizeMake(0, 3)
customDrawn.shadowRadius = 5.0
customDrawn.shadowColor = UIColor.blackColor().CGColor
customDrawn.shadowOpacity = 0.8
customDrawn.cornerRadius = 10.0
customDrawn.borderColor = UIColor.blackColor().CGColor
customDrawn.borderWidth = 2.0
customDrawn.masksToBounds = true
self.view.layer.addSublayer(customDrawn)
customDrawn.setNeedsDisplay()

上面的大部分代码你都是见过的 (比如:创建一个图层,设置一些属性等等) 。有两个地方可能还不太熟悉:

  • 首先,它把 self 设置成了这个图层的 delegate 。这意味着 self 需要实现 drawLayer:inContext 这个方法来绘制图案。
  • 其次,在添加了图层之后,需要通过 setNeedsDisplay 方法告诉图层刷新内容 (调用 drawLayer:inContext 方法),如果你忘了调用,内容永远都不会显示。

时间有限,最后一部分自定义纹理的还没有翻译,其实是 Swift 水平不够不会写了,可以参考原文学习。


原文地址 (Objective-C) :

 

 

 

 

 

 

  • 大小: 5.2 KB
  • 大小: 7.2 KB
  • 大小: 12.6 KB
  • 大小: 12.6 KB
  • 大小: 26.4 KB
分享到:
评论

相关推荐

    WatchAnimationHelper:WatchKit 的 CALayer 动画助手

    ##用法CALayer 属性动画想象以下旋转动画: var rotation = CABasicAnimation ( keyPath : " transform.rotation.z " )rotation. fromValue = 0rotation. toValue = M_PI * 2.0rotation. duration = 2self . ...

    CALayer-AutoresizingMask:为 iOS CALayer 添加 UIViewAutoresize 支持和快速 UIView 到 CALayer 的转换方法

    CALayer-AutoresizingMask 为 iOS CALayer 添加 UIViewAutoresize 支持和快速 UIView 到 CALayer 的转换方法 安装 pod 'CALayer-AutoresizingMask' 用法 不要在这个storyboard或XIB使用自动布局,并使用您需要的...

    CALayer-guide:了解CALayer的财产

    **标题:**CALayer指南:深入理解CALayer的属性 **描述:**在iOS和macOS开发中,CALayer是图形渲染的核心组件,它提供了丰富的视觉效果和动画功能。本指南将详细介绍CALayer的一些关键属性,帮助开发者更好地利用这...

    CALayer的子类

    在iOS和macOS开发中,Core Animation是苹果提供的一个强大的动画和图形框架,它底层的基础元素就是`CALayer`。`CALayer`是苹果UI渲染的核心,它负责管理视图的绘制、动画以及与硬件的交互。本篇将深入探讨`CALayer`...

    CALayer动画实践(二):CAReplicatorLayer的用法

    在以实战的方式对CALayer动画进行了初步的介绍,详解CALayer是如何让动画灵动起来之后,作者继续以示例讲解了更多CALayer动画的知识,主要为CAReplicatorLayer的用法。上一篇文章通过两个动画示例带大家了解和认识了...

    ios-自定义CALayer.zip

    在iOS开发中,CALayer是UI层的核心组件,它负责绘制和动画的实现。自定义CALayer能够让我们根据特定需求创建独特的视觉效果。本示例中的"ios-自定义CALayer.zip"是一个教学项目,旨在指导开发者如何通过自定义...

    图层CALayer的一些知识

    在iOS和macOS开发中,`CALayer`是Core Animation框架的核心组成部分,它是一个轻量级的对象,用于绘制和管理视觉元素。`CALayer`不仅仅是一个绘图对象,还提供了丰富的动画功能,使得开发者能够创建出流畅、高性能的...

    iOS开发中CALayer使用的基本教程

    在iOS开发中,CALayer是Core Animation框架的核心组成部分,它负责UI元素的渲染和动画效果。CALayer并不属于UIKit框架,而是包含在QuartzCore框架内,因此它具有跨平台的特性,适用于iOS和Mac OS X。CALayer是UIView...

    CALayer的基本使用demo

    **CALayer基础知识** 在iOS开发中,`CALayer`是苹果的核心动画框架(Core Animation)中的基础类,它负责在屏幕上绘制和管理视图的内容。`UIView`实际上是由一个`CALayer`对象支持的,视图的大部分视觉效果都是通过...

    CALayer基本使用

    **CALayer基本使用** 在iOS开发中,CALayer是苹果提供的一个核心图形层类,它负责绘制和动画处理。CALayer是UIKit框架的基础,几乎所有的视图(UIView)都有一个对应的CALayer。理解并熟练使用CALayer对于优化性能...

    JXLayerAutoLayout:优雅的实现CALayer AutoLayout

    CALayer是UIKit中的核心组件,它是所有UIView的基础,负责绘制和动画。然而,原生的CALayer并不支持AutoLayout,这就意味着我们需要手动计算和更新位置来实现自适应布局。"JXLayerAutoLayout"项目正是为了解决这个...

    DemoRotation:iOS中的CALayer旋转

    演示轮换iOS中的CALayer旋转这只是我在 iOS 中实现 CALayer 旋转所做的一项工作,它的灵感来自 Roambi 出色的饼图。 我决定在大量润色后分享它,恕我直言,算法很简单,可以分享。 如果您没有通过我的个人博客访问此...

    CALayerAnimation实践(三):iPhone经典滑动解锁动画

    摘要:本文为CALayerAnimation系列第三篇。时至今日,无论iPhone机身样式如何改变,屏幕尺寸如何改变,iOS系统如何改变,唯有锁屏底部闪烁的滑动来解锁不变。它的动画效果是如何实现的呢?这篇文章会告诉你们答案。...

    RoundProgressDemo.zip

    1. **CALayer**: `CALayer` 是 Core Animation 的基础,它是 UIView 的后台渲染层,负责图形的绘制和动画。在这个项目中,开发者可能创建了一个自定义的 `CALayer` 子类,用于绘制圆形进度条和其相关的视觉效果,如...

    CALayer的使用

    在iOS开发中,CALayer是Core Animation框架的核心组件,它负责在屏幕上绘制和动画化视觉内容。`CALayer`是一个轻量级的对象,用于管理视图的几何形状、内容、透明度以及各种视觉效果。本篇文章将深入探讨`CALayer`的...

    CALayer 图层处理

    在iOS和macOS开发中,`CALayer`是Core Animation框架的核心组成部分,它负责图形的渲染和动画。`CALayer`对象是不透明的矩形区域,可以包含内容、边框、阴影等视觉元素,是构建用户界面的基础。这篇内容我们将深入...

    QCAR-CALayer:使用 CALayer 显示 2D-AR 元素

    #QCAR-CALayer 使用 Vuforia AR 引擎 使用不同的方法来显示 2D-AR 元素 QCARWebViewController 使用 UIWebView QCARCALayerViewController 使用 CALayer

    ios-优雅的实现CALayer的"AutoLayout"的两种方案.zip

    然而,对于`CALayer`对象,它们并不直接支持AutoLayout。但通过一些技巧,我们可以让`CALayer`也能享受到类似AutoLayout的功能。本篇文章将探讨两种优雅地实现`CALayer` AutoLayout的方法。 方法一:使用...

    iOS开发中CAlayer层的属性以及自定义层的方法

    在iOS开发中,CAlayer是UIKit框架中的核心部分,它是UI视图的基础,负责处理图形渲染和动画。本文将深入探讨CAlayer的两个关键属性:`position`和`anchorPoint`,以及如何利用它们来调整视图的布局和动画效果。同时...

Global site tag (gtag.js) - Google Analytics