Swift:UIScrollView+Extension

JKSwiftExtension,测试用例在 UIScrollViewExtensionViewController.swift 里面
目录:
1、基本的扩展
2、链式编程

一、基本的扩展
// MARK:- 一、基本的扩展
public extension UIScrollView {

    // MARK: 1.1、适配iOS 11
    /// 适配iOS 11
    @objc func neverAdjustContentInset() {
        if #available(iOS 11.0, *), responds(to: #selector(setter: contentInsetAdjustmentBehavior)) {
            self.contentInsetAdjustmentBehavior = .never
        }
    }

    // MARK: 1.2、设置滚动到:上左下右
    /// 设置滚动到:上左下右
    /// - Parameters:
    ///   - edege: 滚动的位置
    ///   - animated: 是否要动画
    func scroll(edege: Edge, animated: Bool = true) {
        var offset = self.contentOffset
        switch edege {
        case .top:
            offset.y =  -self.contentInset.top
        case .left:
            offset.x = -self.contentInset.left
        case .bottom:
            offset.y = self.contentSize.height - self.bounds.size.height + self.contentInset.bottom
        case .right:
            offset.x = self.contentSize.width - self.bounds.size.width + self.contentInset.right
        }
        self.setContentOffset(offset, animated: animated)
    }
}
二、链式编程
// MARK:- 二、链式编程
public extension UIScrollView {

    // MARK: 2.1、设置偏移量 CGPoint
    /// 设置偏移量
    /// - Parameter offset: 偏移量
    /// - Returns: 返回自身
    @discardableResult
    func contentOffset(_ offset: CGPoint) -> Self {
        contentOffset = offset
        return self
    }

    // MARK: 2.2、设置偏移量 x: CGFloat, y: CGFloat
    /// 设置偏移量 x: CGFloat, y: CGFloat
    /// - Parameters:
    ///   - x: x 偏移量
    ///   - y: y 偏移量
    /// - Returns: 返回自身
    @discardableResult
    func contentOffset(x: CGFloat, y: CGFloat) -> Self {
        contentOffset = CGPoint.init(x: x, y: y)
        return self
    }

    // MARK: 2.3、设置滑动区域大小(CGSize),默认是CGSizeZero
    /// 设置滑动区域大小(width: CGFloat, height: CGFloat),默认是CGSizeZero
    /// - Parameter size: 滑动区域大小
    /// - Returns: 返回自身
    @discardableResult
    func contentSize(_ size: CGSize) -> Self {
        contentSize = size
        return self
    }

    // MARK: 2.4、设置滑动区域大小(width: CGFloat, height: CGFloat),默认是CGSizeZero
    /// 设置滑动区域大小(width: CGFloat, height: CGFloat),默认是CGSizeZero
    /// - Parameters:
    ///   - width: width代表x方向滑动区域大小
    ///   - height: height代表竖向滑动区域大小
    /// - Returns: 返回自身
    @discardableResult
    func contentSize(width: CGFloat, height: CGFloat) -> Self {
       contentSize = CGSize(width: width, height: height)
        return self
    }

    // MARK: 2.5、设置边缘插入内容以外的可滑动区域,默认是UIEdgeInsetsZero(提示:必须设置contentSize后才有效)
    /// 边缘插入内容以外的可滑动区域,默认是UIEdgeInsetsZero(提示:必须设置contentSize后才有效)
    /// - Parameters:
    ///   - top:     代表 顶部 可滑动区域
    ///   - left:    代表 左边 可滑动区域
    ///   - bottom:  代表 底部 可滑动区域
    ///   - right:   代表 右边 可滑动区域
    /// - Returns: 返回自身
    @discardableResult
    func contentInset(top: CGFloat, left: CGFloat, bottom: CGFloat, right: CGFloat) -> Self {
        contentInset = UIEdgeInsets.init(top: top, left: left, bottom: bottom, right: right)
        return self
    }

    // MARK: 2.6、设置边缘插入内容以外的可滑动区域(UIEdgeInsets),默认是UIEdgeInsetsZero(提示:必须设置contentSize后才有效)
    /// 设置边缘插入内容以外的可滑动区域(UIEdgeInsets),默认是UIEdgeInsetsZero(提示:必须设置contentSize后才有效)
    /// - Parameter inset: UIEdgeInsets
    /// - Returns: 返回自身
    @discardableResult
    func contentInset(_ inset: UIEdgeInsets) -> Self {
        contentInset = inset
        return self
    }

    // MARK: 2.7、设置代理
    /// 设置代理
    /// - Parameter delegate: 代理
    /// - Returns: 返回自身
    @discardableResult
    func delegate(_ delegate: UIScrollViewDelegate) -> Self {
        self.delegate = delegate 
        return self
    }

    // MARK: 2.8、设置弹性效果,默认是true, 如果设置成false,则当你滑动到边缘时将不具有弹性效果
    ///  设置弹性效果,默认是true, 如果设置成false,则当你滑动到边缘时将不具有弹性效果
    /// - Parameter bounces: 是否有弹性
    /// - Returns: 返回自身
    @discardableResult
    func bounces(_ bounces: Bool) -> Self {
        self.bounces = bounces
        return self
    }

    // MARK: 2.9、竖直方向 总是可以弹性滑动,默认是 false
    /// 竖直方向总是可以弹性滑动,默认是 false
    /// - Parameter bounces: 是否有弹性
    /// - Returns: 返回自身
    @discardableResult
    func alwaysBounceVertical(_ bounces: Bool) -> Self {
        /**
         提示:当设置为true(前提是属性bounces必须为true)的时候,即使contentSize设置的width 和 height都比UIScrollView的width 和 height小,在垂直方向上都可以有滑动效果,甚至即使我们不设置contentSize都可以产生滑动效果; 反之,如果设置alwaysBounceVertical为true, 那么当contentSize设置的width 和 height都比UIScrollView的width 和 height小的时候,即使bounces设置为true,那么不可能产生弹性效果
         */
        self.alwaysBounceVertical = bounces
        return self
    }

    // MARK: 2.10、水平方向 总是可以弹性滑动,默认是 false
    /// 水平方向 总是可以弹性滑动,默认是 false
    /// - Parameter bounces: 是否有弹性
    /// - Returns: 返回自身
    @discardableResult
    func alwaysBounceHorizontal(_ bounces: Bool) -> Self {
        self.alwaysBounceHorizontal = bounces
        return self
    }

    // MARK: 2.11、设置是否可分页,默认是false, 如果设置成true, 则可分页
    /// 设置是否可分页,默认是false, 如果设置成true, 则可分页
    /// - Parameter enabled: 是否可分页
    /// - Returns: 返回自身
    @discardableResult
    func isPagingEnabled(_ enabled: Bool) -> Self {
        self.isPagingEnabled = enabled
        return self
    }

    // MARK: 2.12、是否显示 水平 方向滑动条,默认是true, 如果设置为false,当滑动的时候则不会显示水平滑动条
    /// 是否显示 水平 方向滑动条,默认是true, 如果设置为false,当滑动的时候则不会显示水平滑动条
    /// - Parameter enabled: 是否显示水平方向滑动条
    /// - Returns: 返回自身
    @discardableResult
    func showsHorizontalScrollIndicator(_ enabled: Bool) -> Self {
        self.showsHorizontalScrollIndicator = enabled
        return self
    }

    // MARK: 2.13、是否显示 垂直 方向滑动条,默认是true, 如果设置为false,当滑动的时候则不会显示水平滑动条
    /// 是否显示 垂直 方向滑动条,默认是true, 如果设置为false,当滑动的时候则不会显示水平滑动条
    /// - Parameter enabled: 是否显示垂直方向滑动条
    /// - Returns: 返回自身
    @discardableResult
    func showsVerticalScrollIndicator(_ enabled: Bool) -> Self {
        self.showsVerticalScrollIndicator = enabled
        return self
    }

    // MARK: 2.14、设置偏移量(x,y)
    /// 设置偏移量
    /// - Parameters:
    ///   - horizontal: 水平方向的偏移量
    ///   - vertical: 垂直方向的偏移量
    ///   - animated: 是否有动画
    /// - Returns: 返回自身
    @discardableResult
    func setContentOffset(_ horizontal: CGFloat, _ vertical: CGFloat, animated: Bool = true) -> Self {
        setContentOffset(CGPoint(x: horizontal, y: vertical), animated: animated)
        return self
    }

    // MARK: 2.15、设置 水平方向(x) 偏移量
    /// 设置 水平方向(x) 偏移量
    /// - Parameters:
    ///   - horizontal: 水平方向(x) 偏移量
    ///   - animated: 是否有动画
    /// - Returns: 返回自身
    @discardableResult
    func setContentOffsetX(_ horizontal: CGFloat, animated: Bool = true) -> Self {
        setContentOffset(CGPoint.init(x: horizontal, y: self.contentOffset.y), animated: animated)
        return self
    }

    // MARK: 2.16、设置 垂直方向(y) 偏移量
    /// 设置 垂直方向(y) 偏移量
    /// - Parameters:
    ///   - vertical: 垂直方向(y) 偏移量
    ///   - animated: 是否有动画
    /// - Returns: 返回自身
    @discardableResult
    func setContentOffsetY( _ vertical: CGFloat, animated: Bool = true) -> Self {
        setContentOffset(CGPoint.init(x: self.contentOffset.x, y: vertical), animated: animated)
        return self
    }

    // MARK: 2.17、设置滑动条的边缘插入,即是距离上、左、下、右的距离,比如:top(20) 当向下滑动时,滑动条距离顶部的距离总是 20
    /// 设置滑动条的边缘插入,即是距离上、左、下、右的距离,比如:top(20) 当向下滑动时,滑动条距离顶部的距离总是 20
    /// - Parameter inset: UIEdgeInset
    /// - Returns: 返回自身
    @discardableResult
    func scrollIndicatorInsets(_ inset: UIEdgeInsets) -> Self {
        scrollIndicatorInsets = inset
        return self
    }

    // MARK: 2.18、是否可滑动,默认是true, 如果默认为false, 则无法滑动
    /// 是否可滑动,默认是true, 如果默认为false, 则无法滑动
    /// - Parameter enabled: 是否可滑动
    /// - Returns: 返回自身
    @discardableResult
    func isScrollEnabled(_ enabled: Bool) -> Self {
        isScrollEnabled = enabled
        return self
    }

    // MARK: 2.19、设置滑动条颜色,默认是灰白色
    /// 设置滑动条颜色,默认是灰白色
    /// - Parameter indicatorStyle: 滑动条颜色
    /// - Returns: 返回自身
    @discardableResult
    func indicatorStyle(_ style: UIScrollView.IndicatorStyle) -> Self {
        indicatorStyle = style
        return self
    }

    // MARK: 2.20、设置减速率,CGFloat类型,当你滑动松开手指后的减速速率, 但是尽管decelerationRate是一个CGFloat类型,但是目前系统只支持以下两种速率设置选择:fast 和 normal
    /// 设置减速率,CGFloat类型,当你滑动松开手指后的减速速率, 但是尽管decelerationRate是一个CGFloat类型,但是目前系统只支持以下两种速率设置选择:fast 和 normal
    /// - Parameter rate: 减速率
    /// - Returns: 返回自身
    @discardableResult
    func decelerationRate(_ rate: UIScrollView.DecelerationRate) -> Self {
        decelerationRate = rate
        return self
    }

    // MARK: 2.21、锁住水平或竖直方向的滑动, 默认为false,如果设置为TRUE,那么在推拖拽UIScrollView的时候,会锁住水平或竖直方向的滑动
    /// 锁住水平或竖直方向的滑动, 默认为false,如果设置为TRUE,那么在推拖拽UIScrollView的时候,会锁住水平或竖直方向的滑动
    /// - Parameter enabled: 是否锁住
    /// - Returns: 返回自身
    @discardableResult
    func isDirectionalLockEnabled(_ enabled: Bool) -> Self {
        isDirectionalLockEnabled = enabled
        return self
    }
}

推荐阅读更多精彩内容