CAScrollLayer显示一部分可滚动图层,该图层十分基础,无法直接响应用户的触摸操作,也不能直接检查可滚动图层的边界,故可避免越界无限滚动。
UIScrollView用的不是CAScrollLayer,而是直接改动图层边界。
CAScrollLayer的滚动模式可设为水平、垂直或者二维
//设置滚动模式
scrollingViewLayer.scrollMode = kCAScrollBoth
func setUpLayer(){
// 1
let textLayer = CATextLayer()
textLayer.frame = someView.bounds
// 2
var string = ""
for _ in 1...20 {
string += "Lorem ipsum dolor sit amet"
}
textLayer.string = string
// 创建一个字体,赋给文本图层
let fontName: CFStringRef = "Noteworthy-Light"
textLayer.font = CTFontCreateWithName(fontName, fontSize, nil)
// 4
textLayer.foregroundColor = UIColor.darkGrayColor().CGColor
//将文本图层设为折行
textLayer.wrapped = true
//左对齐
textLayer.alignmentMode = kCAAlignmentLeft
//按屏幕设置contentsScale属性
textLayer.contentsScale = UIScreen.mainScreen().scale
//设置截断属性
textLayer.truncation
someView.layer.addSublayer(textLayer)
}
注意事项: 所有图层类的渲染缩放系数都默认为1。在添加到视图时,图层自身的contentsScale缩放系数会自动调整,适应当前画面。你需要为手动创建的图层明确指定contentsScale属性,否则默认的缩放系数1会在Retina显示屏上产生部分模糊。
注意:startPoint和endPoint并不是明确的点,而是用单位坐标空间定义,在绘制时映射到图层边界。也就是说x值为1表示点在图层右边缘,y值为1表示点在图层下边缘。
type
属性,虽说该属性只有kCAGradientLayerAxial
一个选择,由数组中的各颜色产生线性过渡渐变。startPoint
到endPoint
的向量A方向产生,设B与A垂直,则各条B平行线上的所有点颜色相同。locations
属性可以使用一个数组(元素取值范围0到1),指定渐变图层参照colors
顺序取用下一个过渡点颜色的位置。colors
的数量保持一致,否则会出错。 func setUpLayer(){
let gradientLayer = CAGradientLayer()
gradientLayer.frame = someView.bounds
//指定颜色数组
gradientLayer.colors = [cgColorForRed(209.0, green: 0.0, blue: 0.0),
cgColorForRed(255.0, green: 102.0, blue: 34.0),
cgColorForRed(255.0, green: 218.0, blue: 33.0),
cgColorForRed(51.0, green: 221.0, blue: 0.0),
cgColorForRed(17.0, green: 51.0, blue: 204.0),
cgColorForRed(34.0, green: 0.0, blue: 102.0),
cgColorForRed(51.0, green: 0.0, blue: 68.0)]
//设置起点
gradientLayer.startPoint = CGPoint(x: 0, y: 0)
//设置止点
gradientLayer.endPoint = CGPoint(x: 0, y: 1)
someView.layer.addSublayer(gradientLayer)
}
func cgColorForRed(red: CGFloat, green: CGFloat, blue: CGFloat) -> AnyObject {
return UIColor(red: red/255.0, green: green/255.0, blue: blue/255.0, alpha: 1.0).CGColor as AnyObject
}
func setUpLayer(){
// 1
let replicatorLayer = CAReplicatorLayer()
replicatorLayer.frame = someView.bounds
// 2
//设制图层数instanceCount
replicatorLayer.instanceCount = 30
//设置绘制延迟
replicatorLayer.instanceDelay = CFTimeInterval(1 / 30.0)
//设图层为2D
replicatorLayer.preservesDepth = false
//实例颜色为白色
replicatorLayer.instanceColor = UIColor.whiteColor().CGColor
// 3、为陆续的实例复件设置RGB颜色偏差值(默认为0,即所有复件保持颜色不变)
这里实例初始颜色为白色,即RGB都为1.0,所以偏差值设红色为0,绿色和蓝色为相同负数会使其逐渐现出红色
replicatorLayer.instanceRedOffset = 0.0
replicatorLayer.instanceGreenOffset = -0.5
replicatorLayer.instanceBlueOffset = -0.5
//alpha透明度偏差值的变化也与此类似,针对陆续的实例复件
replicatorLayer.instanceAlphaOffset = 0.0
// 4、创建旋转变换,使得实例复件按一个圆排列
let angle = Float(M_PI * 2.0) / 30
replicatorLayer.instanceTransform = CATransform3DMakeRotation(CGFloat(angle), 0.0, 0.0, 1.0)
someView.layer.addSublayer(replicatorLayer)
// 5、创建供复制图层使用的实例图层,设置框架,使第一个实例在someView边界顶端水平中心处绘制,另外设置实例颜色,把实例图层添加到复制图层。
let instanceLayer = CALayer()
let layerWidth: CGFloat = 10.0
let midX = CGRectGetMidX(someView.bounds) - layerWidth / 2.0
instanceLayer.frame = CGRect(x: midX, y: 0.0, width: layerWidth, height: layerWidth * 3.0)
instanceLayer.backgroundColor = UIColor.whiteColor().CGColor
replicatorLayer.addSublayer(instanceLayer)
// 6、创建一个透明度由1(不透明)过渡为0(透明)的淡出动画。
let fadeAnimation = CABasicAnimation(keyPath: "opacity")
fadeAnimation.fromValue = 1.0
fadeAnimation.toValue = 0.0
fadeAnimation.duration = 1
fadeAnimation.repeatCount = Float(Int.max)
// 7、设实例图层透明度为0,使得每个实例在绘制和改变颜色与alpha前保持透明
instanceLayer.opacity = 0.0
instanceLayer.addAnimation(fadeAnimation, forKey: "FadeAnimation")
}