美文网首页
CALayer解析2:CAScrollLayer

CALayer解析2:CAScrollLayer

作者: 狂奔的胖蜗牛 | 来源:发表于2017-08-25 10:32 被阅读233次

    1.简介

    CAScrollLayer是CALayer的子类,显示的是可滚动的图层的一部分,UIScrollView自带了该图层。该层不能直接响应用户的触摸,也不会去检查可滚动的区域,UIScrollView限制了其CAScrollLayer的滚动区域。

    可以使CAScrollLayer滚动模式为水平或者垂直,还可以指定滚动到特定的地点。

    2.使用

    我们自定义一个可以随便滚动的ScrollView来说明。

    //首先,创建出自定义的ScrollView
    import UIKit
    
    class CustomScrollView: UIView {
    
        //重写该属性,作用是让原来的layer变成CAScrollLayer
        override class var layerClass : AnyClass {
            return CAScrollLayer.self
        }
        
        override init(frame: CGRect) {
            super.init(frame: frame)
            
            //设置scrollView的layer的滚动模式
            (layer as! CAScrollLayer).scrollMode = kCAScrollBoth
            let pan = UIPanGestureRecognizer(target: self, action: #selector(pan(pan:)))
            addGestureRecognizer(pan)
        }
        
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
        
        func pan(pan: UIPanGestureRecognizer) {
            var newPoint = bounds.origin
            newPoint.x -= pan.translation(in: self).x
            newPoint.y -= pan.translation(in: self).y
            pan.setTranslation(CGPoint.zero, in: self)
            (layer as! CAScrollLayer).scroll(to: newPoint)
        }
    
    }
    

    使用方式如下:

    import UIKit
    
    class ViewController: UIViewController {
        
        
        var scrollView: CustomScrollView!
        
    
        override func viewDidLoad() {
            super.viewDidLoad()
            scrollView = CustomScrollView(frame: CGRect(x: view.frame.width/2-100, y: 100, width: 200, height: 200))
            
            let image = UIImageView(frame: scrollView.bounds)
            image.image = UIImage(named: "111.jpg")
            image.contentMode = .center
            
            scrollView.addSubview(image)
            view.addSubview(scrollView)
        }
        
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            
        }
    }
    

    最终,这样就自定义出一个可以随便滚动的scrollView。

    2017-08-25 10_24_27.gif

    3.结论

    • 1.如果只需要一些很简单的很轻量级的东西,可以考虑使用
    • 2.如果需要更加复杂的滚动效果,应该使用UIScrollView
    • 3.如果滚动非常大的图像,应该考虑使用CATiledLayer

    相关文章

      网友评论

          本文标题:CALayer解析2:CAScrollLayer

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