PositionScrollView
Position Scroll View 是一个纯 Swift UI Scroll View,可以获取或移动滚动位置。
特性
- 获取滚动位置的滚动位置
- 垂直,水平,二维滚动
- 通过代码移动滚动位置
- 使页面滚动页面边缘粘性或滚动结束后跟随动量。
要求
- Xcode 11.6+
- Swift 5.2+
安装
在 Xcode 的 Swift Package 管理器选项卡中为 SwiftPackageManager 添加 url
CocoaPods
pod ‘PositionScrollView’
用法
PositionScrollView将整个目标视图划分为页面和单位,以便于处理滚动位置。
以下是一个最小水平滚动视图的示例。
import Foundation
import SwiftUI
/// Extended ScrollView which can controll position
public struct MinimalHorizontalExample: View, PositionScrollViewDelegate {
/// Page size of Scroll
var pageSize = CGSize(width: 200, height: 300)
// Create PositionScrollViewModel
// (Need to create in parent view to bind the state between this view and PositionScrollView)
@ObservedObject var psViewModel = PositionScrollViewModel(
pageSize: CGSize(width: 200, height: 300),
horizontalScroll: Scroll(
scrollSetting: ScrollSetting(pageCount: 5, afterMoveType: .stickNearestUnitEdge),
pageLength: 200 // Page length of direction
)
)
public var body: some View {
return VStack {
PositionScrollView(
viewModel: self.psViewModel,
delegate: self
) {
HStack(spacing: 0) {
ForEach(0...4, id: \.self){ i in
ZStack {
Rectangle()
.fill(BLUES[i])
.border(Color.black)
.frame(
width: self.pageSize.width, height: self.pageSize.height
)
Text("Page\(i)")
.foregroundColor(Color.white)
.font(.system(size: 24, weight: .heavy, design: .default))
}
}
}
}
// Get page via scroll object
Text("page: \(self.psViewModel.horizontalScroll?.page ?? 0)")
// Get position via scroll object
Text("position: \(self.psViewModel.horizontalScroll?.position ?? 0)")
}
}
struct SampleView_Previews: PreviewProvider {
static var previews: some View {
return MinimalHorizontalExample()
}
}
// Delegate methods of PositionScrollView
// You can monitor changes of position
public func onScrollStart() {
print("onScrollStart")
}
public func onChangePage(page: Int) {
print("onChangePage to page: \(page)")
}
public func onChangePosition(position: CGFloat) {
print("position: \(position)")
}
public func onScrollEnd() {
print("onScrollEnd")
}
}
API详情
滚动设置
设置变量
变量名 | 类型 | 默认值 | 详情 |
---|---|---|---|
pageCount* | Int | - | 页面数量 |
initialPage | Int | 0 | 初始页面 |
unitCountInPage | Int | 1 | 每页单位数量 |
afterMoveType | 滚动结束后行为 | .stickToNearestUnitEdge | 滚动结束后移动的行为 stickToNearestUnitEdge: 粘靠到最近的单位边缘 momentum: 直到惯性消失。 |
scrollSpeedToDetect | Double | 30 | 检测滚动速度 |
滚动
变量
变量名 | 类型 | 详情 |
---|---|---|
position | CGFloat | 基于页面0起始位置的位置 |
page | Int | 当前页面 |
pageInPosition | CGFloat | 基于页面起始位置的当前位置 |
unit | Int | 页面中的当前单位 |
positionInUnit | CGFloat | 基于单位起始位置的当前位置 |
函数
函数名 | 参数 | 详情 |
---|---|---|
moveBy | value: CGFloat | 按参数值移动滚动 |
moveTo | position: CGFloat | 将滚动移动到参数位置 |
moveToPage | page: Int unit: Int = 0 positionInUnit: CGFloat = 0 |
将滚动移动到参数页 |
PositionScrollViewDelegate
函数名 | 参数 | 详情 |
---|---|---|
onScrollStart | - | 滚动开始时调用 |
onChangePosition | position: CGFloat | 位置改变时调用 |
onChangePage | page: Int | 页面改变时调用 |
onChangeUnit | unit: Int | 单位改变时调用 |
onChangePositionInPage | positionInPage: CGFloat | 页面内位置改变时调用 |
onChangePositionInUnit | positionInUnit: CGFloat | 单位内位置改变时调用 |
onScrollEnd | - | 滚动结束时调用 |
联系,作者
请随时联系我。 kazuooooo