A SwiftUI library with powerful UIKit features.
- Get and set scroll view
contentOffset
- Set scroll view
isPagingEnabled
,bounces
and other properties - Pull down or up table view to refresh data or load more data
- Reload table view data or rows
- Scroll table view to the specific row
- Get and set page control
currentPage
- iOS 13.0+
- Swift 5
- Add
pod 'BBSwiftUIKit'
to your Podfile. - Run
pod install
orpod update
. - Add
import BBSwiftUIKit
to the Swift source file.
BBSwiftUIKit is available through Swift Package Manager.
- For App integration
For App integration, you should using Xcode 11 or higher, to add this package to your App target. To do this, check Adding Package Dependencies to Your App about the step by step tutorial using Xcode.
- For downstream framework
For downstream framework author, you should create a Package.swift
file into your git repo, then add the following line to mark your framework dependent our BBSwiftUIKit.
let package = Package(
dependencies: [
.package(url: "https://github.com/Silence-GitHub/BBSwiftUIKit.git", from: "0.1.0")
],
)
Use BBScrollView
with UIScrollView
features.
// Content offset binding with scroll view content offset
@State var contentOffset: CGPoint = .zero
// Set CGPoint value to scroll to the content offset with animation. After scrolling, it will reset to nil automatically
@State var contentOffsetToScrollAnimated: CGPoint? = nil
// Create a scroll view scrolling horizontally
// Get and set content offset
BBScrollView(.horizontal, contentOffset: $contentOffset) {
// Add views
HStack {
...
}
}
.bb_bounces(false) // Disable bounces
.bb_isPagingEnabled(true) // Enable paging
.bb_alwaysBounceHorizontal(true) // Enable always bounce horizontal
.bb_showsHorizontalScrollIndicator(false) // Hide horizontal scroll indicator
.bb_contentOffsetToScrollAnimated($contentOffsetToScrollAnimated) // Set content offset with animation
Use BBTableView
with UITableView
features.
class Model: ObservableObject {
// Table view data source
@Published var list: [Int] = ...
// Set true to reload data. After reloading, it will reset to false automatically
@Published var reloadData: Bool = false
// Set row indexes to reload rows. After reloading, it will reset to empty automatically
@Published var reloadRows: [Int] = []
// Set row index to scroll to the specific row. After scrolling, it will reset to nil automatically
@Published var scrollToRow: Int? = nil
// Pull down to refresh data. While refreshing, this value is true. After refreshing, we need to set it false to end refreshing
@Published var isRefreshing: Bool = false
// Pull up to loading more data. We should manage this value to prevent calling load more function too many times
@Published var isLoadingMore: Bool = false
}
// Create a table view with data source
BBTableView(model.list) { item in
// Add views
}
.bb_reloadData($model.reloadData) // Reload data
.bb_reloadRows($model.reloadRows, animation: .automatic) // Reload rows
.bb_scrollToRow($model.scrollToRow, position: .none, animated: true) // Scroll to row
.bb_setupRefreshControl { refreshControl in
// Update refresh control appearance
refreshControl.tintColor = .blue
refreshControl.attributedTitle = NSAttributedString(string: "Loading...", attributes: [.font: UIFont.systemFont(ofSize: 15), .foregroundColor: UIColor.blue])
}
.bb_pullDownToRefresh(isRefreshing: $model.isRefreshing) {
// Pull down to refresh data
// Now the value of isRefreshing is true
self.loadNewData { newData in
self.model.list = newData // Update data source
self.model.isRefreshing = false // End refreshing
}
}
.bb_pullUpToLoadMore(bottomSpace: 30) {
// Pull up to load more data
if self.model.isLoadingMore { return } // Do not load more if it is loading more
self.model.isLoadingMore = true // Mark it is loading more
self.loadMoreData { moreData in
self.model.list.append(moreData) // Update data source
self.model.isLoadingMore = false // Mark it is NOT loading more
}
}
BBSwiftUIKit is released under the MIT license. See LICENSE for details.