EmptyDataSet-Swift
一个UIKit的UITableView/UICollectionView父类扩展,当视图没有内容显示时显示空数据集。Swift版本的DZNEmptyDataSet。
屏幕截图
安装
CocoaPods
pod 'EmptyDataSet-Swift', '~> 5.0.0'
Carthage
github "Xiaoye220/EmptyDataSet-Swift" "4.2.0"
使用方法
基本功能
类似于 DZNEmptyDataSet
import EmptyDataSet_Swift
class OriginalUsageViewController: UITableViewController, EmptyDataSetSource, EmptyDataSetDelegate {
override func viewDidLoad() {
super.viewDidLoad()
tableView.emptyDataSetSource = self
tableView.emptyDataSetDelegate = self
}
}
EmptyDataSetDelegate
public protocol EmptyDataSetDelegate: class {
/// Asks the delegate to know if the empty dataset should fade in when displayed. Default is true.
func emptyDataSetShouldFadeIn(_ scrollView: UIScrollView) -> Bool
/// Asks the delegate to know if the empty dataset should still be displayed when the amount of items is more than 0. Default is false.
func emptyDataSetShouldBeForcedToDisplay(_ scrollView: UIScrollView) -> Bool
/// Asks the delegate to know if the empty dataset should be rendered and displayed. Default is true.
func emptyDataSetShouldDisplay(_ scrollView: UIScrollView) -> Bool
/// Asks the delegate for touch permission. Default is true.
func emptyDataSetShouldAllowTouch(_ scrollView: UIScrollView) -> Bool
/// Asks the delegate for scroll permission. Default is false.
func emptyDataSetShouldAllowScroll(_ scrollView: UIScrollView) -> Bool
/// Asks the delegate for image view animation permission. Default is false.
/// Make sure to return a valid CAAnimation object from imageAnimationForEmptyDataSet:
func emptyDataSetShouldAnimateImageView(_ scrollView: UIScrollView) -> Bool
/// Tells the delegate that the empty dataset view was tapped.
/// Use this method either to resignFirstResponder of a textfield or searchBar.
func emptyDataSet(_ scrollView: UIScrollView, didTapView view: UIView)
/// Tells the delegate that the action button was tapped.
func emptyDataSet(_ scrollView: UIScrollView, didTapButton button: UIButton)
/// Tells the delegate that the empty data set will appear.
func emptyDataSetWillAppear(_ scrollView: UIScrollView)
/// Tells the delegate that the empty data set did appear.
func emptyDataSetDidAppear(_ scrollView: UIScrollView)
/// Tells the delegate that the empty data set will disappear.
func emptyDataSetWillDisappear(_ scrollView: UIScrollView)
/// Tells the delegate that the empty data set did disappear.
func emptyDataSetDidDisappear(_ scrollView: UIScrollView)
}
EmptyDataSetSource
public protocol EmptyDataSetSource: class {
/// Asks the data source for the title of the dataset.
/// The dataset uses a fixed font style by default, if no attributes are set. If you want a different font style, return a attributed string.
func title(forEmptyDataSet scrollView: UIScrollView) -> NSAttributedString?
/// Asks the data source for the description of the dataset.
/// The dataset uses a fixed font style by default, if no attributes are set. If you want a different font style, return a attributed string.
func description(forEmptyDataSet scrollView: UIScrollView) -> NSAttributedString?
/// Asks the data source for the image of the dataset.
func image(forEmptyDataSet scrollView: UIScrollView) -> UIImage?
/// Asks the data source for a tint color of the image dataset. Default is nil.
func imagetintColor(forEmptyDataSet scrollView: UIScrollView) -> UIColor?
/// Asks the data source for the image animation of the dataset.
func imageAnimation(forEmptyDataSet scrollView: UIScrollView) -> CAAnimation?
/// Asks the data source for the title to be used for the specified button state.
/// The dataset uses a fixed font style by default, if no attributes are set. If you want a different font style, return a attributed string.
func buttonTitle(forEmptyDataSet scrollView: UIScrollView, for state: UIControlState) -> NSAttributedString?
/// Asks the data source for the image to be used for the specified button state.
/// This method will override buttonTitleForEmptyDataSet:forState: and present the image only without any text.
func buttonImage(forEmptyDataSet scrollView: UIScrollView, for state: UIControlState) -> UIImage?
/// Asks the data source for a background image to be used for the specified button state.
/// There is no default style for this call.
func buttonBackgroundImage(forEmptyDataSet scrollView: UIScrollView, for state: UIControlState) -> UIImage?
/// Asks the data source for the background color of the dataset. Default is clear color.
func backgroundColor(forEmptyDataSet scrollView: UIScrollView) -> UIColor?
/// Asks the data source for a custom view to be displayed instead of the default views such as labels, imageview and button. Default is nil.
/// Use this method to show an activity view indicator for loading feedback, or for complete custom empty data set.
/// Returning a custom view will ignore -offsetForEmptyDataSet and -spaceHeightForEmptyDataSet configurations.
func customView(forEmptyDataSet scrollView: UIScrollView) -> UIView?
/// Asks the data source for a offset for vertical alignment of the content. Default is 0.
func verticalOffset(forEmptyDataSet scrollView: UIScrollView) -> CGFloat
/// Asks the data source for a vertical space between elements. Default is 11 pts.
func spaceHeight(forEmptyDataSet scrollView: UIScrollView) -> CGFloat
}
扩展
使用时不需要遵守数据源和/或代理。TableView只需调用以下方法。
public func emptyDataSetView(_ closure: @escaping (EmptyDataSetView) -> Void)
示例
tableView.emptyDataSetView { view in
view.titleLabelString(titleString)
.detailLabelString(detailString)
.image(image)
.imageAnimation(imageAnimation)
.buttonTitle(buttonTitle, for: .normal)
.buttonTitle(buttonTitle, for: .highlighted)
.buttonBackgroundImage(buttonBackgroundImage, for: .normal)
.buttonBackgroundImage(buttonBackgroundImage, for: .highlighted)
.dataSetBackgroundColor(backgroundColor)
.verticalOffset(verticalOffset)
.verticalSpace(spaceHeight)
.shouldDisplay(true, view: tableView)
.shouldFadeIn(true)
.isTouchAllowed(true)
.isScrollAllowed(true)
.isImageViewAnimateAllowed(isLoading)
.didTapDataButton {
// Do something
}
.didTapContentView {
// Do something
}
}
关于自定义视图
通过使用 EmptyDataSetSource 设置自定义视图,其他设置将无效。通过使用 Extensions 设置自定义视图,其他自动布局将无效。
自定义视图显示规则
- 自定义视图将在 tableView 的中心显示
- 可以通过
func verticalOffset(forEmptyDataSet scrollView: UIScrollView) -> CGFloat
设置自定义视图的 verticalOffset。 - 宽度与高度等于自定义视图的框架。但是,如果自定义视图是UILabel并且它的框架为CGRect.zero,则它的宽度和高度将根据其内容进行自动布局。
示例
规则 1
func customView(forEmptyDataSet scrollView: UIScrollView) -> UIView? {
let view = CustomView(frame: CGRect(x: 0, y: 0, width: 150, height: 150))
return view
}
tableView.emptyDataSetView { [weak self] view in
view.customView(CustomView(frame: CGRect(x: 0, y: 0, width: 150, height: 150)))
}
上述代码将显示如下
规则 2
func customView(forEmptyDataSet scrollView: UIScrollView) -> UIView? {
let view = CustomView(frame: CGRect(x: 0, y: 0, width: 150, height: 150))
return view
}
func verticalOffset(forEmptyDataSet scrollView: UIScrollView) -> CGFloat {
return 200
}
tableView.emptyDataSetView { [weak self] view in
view.customView(CustomView(frame: CGRect(x: 0, y: 0, width: 150, height: 150)))
.verticalOffset(200)
}
上述代码将显示如下
规则 3
func customView(forEmptyDataSet scrollView: UIScrollView) -> UIView? {
let label = UILabel()
label.text = "CustomView"
label.backgroundColor = UIColor.red
return label
}
上述代码将显示如下