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
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容