iOS 动画 Animation-0-2:CALayer十则示例-CAScrollLayer

iOS 动画 Animation

Posted by FishYan on July 15, 2016

iOS 动画 Animation-0-2:CALayer十则示例-CAScrollLayer

CAScrollLayer

CAScrollLayer显示一部分可滚动图层,该图层十分基础,无法直接响应用户的触摸操作,也不能直接检查可滚动图层的边界,故可避免越界无限滚动。

UIScrollView用的不是CAScrollLayer,而是直接改动图层边界。

CAScrollLayer的滚动模式可设为水平、垂直或者二维,你也可以用代码命令视图滚动到指定位置:

// In ScrollingView.swift
import UIKit
  
class ScrollingView: UIView {
  // 1
  override class func layerClass() -> AnyClass {
    return CAScrollLayer.self
  }
}
  
// In CAScrollLayerViewController.swift
import UIKit
  
class CAScrollLayerViewController: UIViewController {
  @IBOutlet weak var scrollingView: ScrollingView!
  
  // 2
  var scrollingViewLayer: CAScrollLayer {
    return scrollingView.layer as CAScrollLayer
  }
  
  override func viewDidLoad() {
    super.viewDidLoad()
    // 3
    scrollingViewLayer.scrollMode = kCAScrollBoth
  }
  
  @IBAction func tapRecognized(sender: UITapGestureRecognizer) {
    // 4
    var newPoint = CGPoint(x: 250, y: 250)
    UIView.animateWithDuration(0.3, delay: 0, options: .CurveEaseInOut, animations: {
      [unowned self] in
      self.scrollingViewLayer.scrollToPoint(newPoint)
      }, completion: nil)
  }
  
}

以上代码:

  • 定义一个继承UIView的类,重写layerClass()返回CAScrollLayer,该方法等同于创建一个新图层作为子图层(CALayer示例中做过)。
  • 一个用以方便简化访问自定义视图滚动图层的计算属性。
  • 设滚动模式为二维滚动。
  • 识别出轻触手势时,让滚动图层在UIView动画中滚到新建的点。(注:scrollToPoint(:)和scrollToRect(:)不会自动使用动画效果。)

案例研究:如果ScrollingView实例包含大于滚动视图边界的图片视图,在运行上述代码并点击视图时结果如下:

图层演示应用中有可以锁定滚动方向(水平或垂直)的开关。

以下经验规律用于决定是否使用CAScrollLayer:

如果想使用轻量级的对象,只需用代码操作滚动:可以考虑CAScrollLayer。 如果想让用户操作滚动,UIScrollView大概是更好的选择。

如果是滚动大型图片:考虑使用CATiledLayer(见后文)。