Swift:UIScrollView+Extension
2020-11-12 本文已影响0人
IIronMan
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
}
}