Skip to content

swift版下拉刷新,支持多种样式,同时支持,加载动画,网络错误占位(有兴趣学习如何用swift使用runtime的可以看看)

License

Notifications You must be signed in to change notification settings

AnRanScheme/MagiRefresh

Repository files navigation

MagiRefresh

当tabelView和collectionView的数据源为0的时候可以显示数据为空的替代页面, 并且内置多种动画、可自定义和灵活的iOS下拉刷新框架(Swift实现)

Bug提交 · 需求提交


Status

building GitHub license CocoaPods Compatible language platform Email


PlaceHolder Screenshots

数据为空的样式 tableView collectionView webView

PlaceHolder 特点

可以定义数据为空的样式因为每个项目的需求不一样所以我就添加了一个customView 只要将自定义的view付给他就好 还有一个我提供的样式可以设置图片

这只是一个简单而实用的附带功能他只能使用在以上的3个控件上

PlaceHolder 使用方法

初始化控件
  1. MagiRefresh提供的方法
    // 空数据界面显示
    let placeHolder = MagiPlaceHolder.createPlaceHolderWithClosure(
        imageName: "search_noData",
        title: "NoData",
        detailTitle: "",
        refreshBtnTitle: "") {
        print("TapRefreshButton")
    }
    placeHolder.contentViewOffset = -100
    placeHolder.titleLabFont = UIFont.systemFont(ofSize: 18)
    placeHolder.titleLabTextColor = UIColor.purple
    tableView.magiRefresh.placeHolder = placeHolder
    tableView.magiRefresh.placeHolder?.tapBlankViewClosure = {
                print("TapBlankView")
    }       
    tableView.magiRefresh.showPlaceHolder()
  2. MagiRefresh提供的自定义方法
    let emptyView = Bundle.main.loadNibNamed(
        "MyEmptyView", owner: self, options: nil)?.last
        as! MyEmptyView
    emptyView.reloadBtn.addTarget(
             self,
             action: #selector(reloadBtnAction(_:)),
             for: .touchUpInside)
    emptyView.frame = view.bounds
    //空数据界面显示
    let placeHolder = MagiPlaceHolder.createCustomPlaceHolder(emptyView)
    tableView.magiRefresh.placeHolder = placeHolder
    tableView.magiRefresh.placeHolder?.tapBlankViewClosure = {
             print("点击界面空白区域")
    }
    tableView.magiRefresh.showPlaceHolder()

Refresh Screenshots

MagiRefreshStyle Top Screenshots Bottom Screenshots
native
replicatorWoody
replicatorAllen
replicatorCircle
replicatorDot
replicatorArc
replicatorTriangle
animatableRing
animatableArrow

特点

  • 支持多样式选择与自定义

总共有9种动画样式

  • 非刷新状态自动隐藏

即使手动调整过contentInset,依然能够在非刷新状态自动隐藏影。最常见的情况是:当数据量过少,UITableView停止刷新后,用户依旧能看到刷新控件的存在,从而影响的视觉体验。

  • 刷新结束时抗抖动

当UIScrollView处于刷新状态,且用户滑动UIScrollView,当刷新结束时,MagiRefresh不会调整UIScrollView的内容,从而导致页面跳动;

  • 支持设置控件高度

stretchOffsetYAxisThreshold是根据刷新控件的高度进行的比例调整。如:当设置stretchOffsetYAxisThreshold为1.5时,触发刷新的偏移距离将调整为原来的1.5倍。(设置时请大于1)

  • 支持全局配置

MagiRefreshDefaults类似一个配置表,通过该配置表配置全局的刷新样式,而无需在每一个页面初始化或者绑定刷新控件。

  • 支持进度回调

实时回调拖拽的偏移比例,对于扩展接口,可根据进度调整动画。该接口的开放可用于扩展更多的刷新样式。

  • 自适应contentInset系统调整与手动调整

自适应iOS7以后UINavigationController自动调整scrollview contentOffset,MagiRefresh也对iOS 11进行了适配;当您手动设置了contentInset的值,也无需担心MagiRefresh会影响到视觉效果。

  • 解决刷新状态分组视图悬停问题

即使在列表滑动时,分组视图都将跟随ScrollView滑动(即使处于高速滑动状态下!)。

  • 支持预加载

    当用户滑动scrollview接近至底部时,将会自动触发刷新,无需用户再滑至底部后拉起scrollview。该功能默认不开启,因为多数人不查看文档便欣然使用改功能,不正确使用极容易引发刷新无法停止。

    使用预加载功能,请严格按照下面要求使用:

    • tableView.magiRefresh.footer?.isAutoRefreshOnFoot = true 请手动将刷新该属性至为False;

    • 在刷新调用的block块中,严格按下列逻辑编写:

       if (没有数据需要拼接了) {
           self?.tableView.magiRefresh.footer?.endRefreshingAndNoLongerRefreshingWithAlertText("no more")
       } else {
           self?.tableView.magiRefresh.footer?.endRefreshingWithAlertText( "Did load successfully", completion:nil)
       }
  • 文档覆盖率100%、支持横竖屏切换自适应、iOS 7+。

安装

  • CocoaPods
pod 'MagiRefresh'

使用

1.初始化控件
  • 方式一
// MARK: - head
tableView.magiRefresh.bindStyleForHeaderRefresh(themeColor: UIColor.red,
                                                         refreshStyle: MagiRefreshStyle.animatableArrow,
                                                         completion: {
                                                            print("加载完成处理逻辑")
})

// MARK: - foot
tableView.magiRefresh.bindStyleForFooterRefresh(themeColor: UIColor.red,
                                                 refreshStyle: MagiRefreshStyle.animatableArrow,
                                                 completion: {
                                                            print("加载完成处理逻辑")
})

// MARK: - auto refresh
tableView.magiRefresh.footer?.isAutoRefreshOnFoot = true
  • 方式二
let header = MagiArrowHeader()
header.magiRefreshingClosure {  [weak self] in
      print("加载完成处理逻辑")
}
tableView.magiRefresh.header = header
  • 方式三 全局配置
func application(_ application: UIApplication, didFinishLaunchingWithOptions 
                  launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
       MagiRefreshDefaults.shared.headerDefaultStyle = .replicatorAllen
	
       return true
}

// MARK: - global

tableView.magiRefresh.bindStyleForHeaderRefresh {
          
}
3.手动触发刷新
tableView.magiRefresh.header?.beginRefreshing()
tableView.magiRefresh.footer?.beginRefreshing()
4.结束刷新
/*
一般方式结束刷新
*/
func endRefreshing()
 
/*
结束刷新且需要提示文字
*/
func endRefreshingWithAlertText(_ text: String = "", completion: (()->())?)

/*
结束刷新且不再需要刷新功能
*/
func endRefreshingAndNoLongerRefreshingWithAlertText(_ text: String)
5.重新恢复刷新
/**
 当调用过 ‘endRefreshingAndNoLongerRefreshingWithAlertText’,
且重新需要恢复刷新功能室,调用下面方法
*/
func resumeRefreshAvailable()

自定义

以MagiRefreshHeaderConrol为例:

override func setupProperties() {
       super.setupProperties()
       //初始化属性
}
	
 
override func magiDidScrollWithProgress(progress: CGFloat, max: CGFloat) {
       //进度回调
}

override func magiRefreshStateDidChange(_ status: MagiRefreshStatus) {
        super.magiRefreshStateDidChange(status)
	     switch status {
        case .none:
            break
        case .scrolling:
            break
        case .ready:
            break
        case .refreshing:
            break
        case .willEndRefresh:
            break
        }
 }

小记

这个框架呢,是我最近在写一个新的项目Swift,因为是新的所以说有的东西动用比较新的技术,但是我看到了MJRefresh这个OC框架不能忍,我看了挺多的Swift的下拉刷新框架都觉得不是很好,但是不久之前看到了一个OC的框架KafkaRefresh,我决定修改一下架构然后重写了一个Swift板的,当然架构还是有所不同的但是样式是一样的

About

swift版下拉刷新,支持多种样式,同时支持,加载动画,网络错误占位(有兴趣学习如何用swift使用runtime的可以看看)

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published