{"id":20357708,"url":"https://github.com/tmtbo/ttarefresher","last_synced_at":"2025-03-04T17:46:51.763Z","repository":{"id":56923305,"uuid":"91448842","full_name":"TMTBO/TTARefresher","owner":"TMTBO","description":null,"archived":false,"fork":false,"pushed_at":"2017-05-31T11:00:58.000Z","size":3545,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-02-15T10:37:50.454Z","etag":null,"topics":["pull-down-refresh","pull-to-refresh","refresh"],"latest_commit_sha":null,"homepage":null,"language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/TMTBO.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-05-16T11:05:37.000Z","updated_at":"2017-05-19T19:25:02.000Z","dependencies_parsed_at":"2022-08-21T05:20:37.557Z","dependency_job_id":null,"html_url":"https://github.com/TMTBO/TTARefresher","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TMTBO%2FTTARefresher","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TMTBO%2FTTARefresher/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TMTBO%2FTTARefresher/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TMTBO%2FTTARefresher/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TMTBO","download_url":"https://codeload.github.com/TMTBO/TTARefresher/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241894987,"owners_count":20038508,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["pull-down-refresh","pull-to-refresh","refresh"],"created_at":"2024-11-14T23:23:11.904Z","updated_at":"2025-03-04T17:46:51.738Z","avatar_url":"https://github.com/TMTBO.png","language":"Swift","readme":"# TTARefresher\n\n**A easy way to pull to refresh, Thanks for [MJRefresh](https://github.com/CoderMJLee/MJRefresh)**\n\n[![CI Status][image-1]][1]\n[![Version][image-2]][2]\n[![License][image-3]][3]\n[![Platform][image-4]][4]\n\n## Contents\n\n[Example](#Example)\n\n[Requirements](#Requirements)\n\n[Installation](#Installation)\n\n[File Structures](#File_Structures)\n\n[Api](#Api)\n\n* [Name Space](#Name_Space)\n\n* [Refresher States](#Refresher_States)\n\n* [TTARefresherComponent](#TTARefresherComponent)\n\n* [TTARefresherStateHeader](#TTARefresherStateHeader)\t\n* [TTARefresherFooter](#TTARefresherFooter)\n\n* [TTARefresherAutoFooter](#TTARefresherAutoFooter)\n\n* [TTARefresherBackFooter](#TTARefresherBackFooter)\n\n* [TTARefresherAutoStateFoote](#TTARefresherAutoStateFoote)\n\n* [TTARefresherBackStateFooter](#TTARefresherBackStateFooter)\n\n* [TTARefresherAutoNormalFooter](#TTARefresherAutoNormalFooter)\n\n* [TTARefresherBackNormalFooter](#TTARefresherBackNormalFooter)\n\n* [TTARefresherNormalHeader](#TTARefresherNormalHeader)\n\n* [TTARefresherAutoGifFooter](#TTARefresherAutoGifFooter)\n\n* [TTARefresherBackGifFooter](#TTARefresherBackGifFooter)\n\n* [TTARefresherGifHeader](#TTARefresherGifHeader)\n\n* [Header](#Header)\n\n* [Footer](#Footer)\n\n[How to use ](#How_to_use )\n\n[Author](#Author)\n\n[License](#License)\n\n## \u003ca name=\"Example\"\u003e\u003c/a\u003eExample\n\nTo run the example project, clone the repo, and run `pod install` from the Example directory first.\n\n## \u003ca name=\"Requirements\"\u003e\u003c/a\u003eRequirements\n\n* iOS \u003e= 8.3\n* Swift \u003e= 3.0\n\n## \u003ca name=\"Installation\"\u003e\u003c/a\u003eInstallation\n*  TTARefresher is available through [CocoaPods][5]. To install\nit, simply add the following line to your Podfile:`pod \"TTARefresher\"`\n\n*  Manual import：\n\n\tDrag All files in the MJRefresh folder to project, import the main file：`import TTARefresher`\n\n## \u003ca name=\"File_Structures\"\u003e\u003c/a\u003eFile Structures\n\n\t\tTTARefresherComponent\n\t\t\t|\n\t\t\t|- TTARefresherHeader\n\t\t\t|\t\t|\n\t\t\t|\t\t|- TTARefresherStateHeader\n\t\t\t|\t\t\t\t|\n\t\t\t|\t\t\t\t|- TTARefresherNormalHeader (DIRECTLY USE)\n\t\t\t|\t\t\t\t|\n\t\t\t|\t\t\t\t|- TTARefresherGifHeader (DIRECTLY USE)\n\t\t\t|\n\t\t\t|- TTARefresherFooter\n\t\t\t\t\t|\n\t\t\t\t\t|- TTARefresherAutoFooter\n\t\t\t\t\t|\t\t|\n\t\t\t\t\t|\t\t|- TTARefresherAutoStateFoote\n\t\t\t\t\t|\t\t\t\t|\n\t\t\t\t\t|\t\t\t\t|- TTARefresherAutoNormalFooter (DIRECTLY USE)\n\t\t\t\t\t|\t\t\t\t|\n\t\t\t\t\t|\t\t\t\t|- TTARefresherAutoGifFooter (DIRECTLY USE)\n\t\t\t\t\t|\n\t\t\t\t\t|- TTARefresherBackFooter\n\t\t\t\t\t\t\t|\n\t\t\t\t\t\t\t|- TTARefresherBackStateFoote\n\t\t\t\t\t\t\t\t\t|\n\t\t\t\t\t\t\t\t\t|- TTARefresherBackNormalFooter (DIRECTLY USE)\n\t\t\t\t\t\t\t\t\t|\n\t\t\t\t\t\t\t\t\t|- TTARefresherBackGifFooter (DIRECTLY USE)\n\t \n## \u003ca name=\"Api\"\u003e\u003c/a\u003eApi\n\n**\u003ca name=\"Name_Space\"\u003e\u003c/a\u003eName Space**\n\n    /// For the Instance Methods\n    public var ttaRefresher: TTARefresher.TTARefresherProxy\u003cSelf\u003e\n\t\n\t// /For the Static Methods\n    public static var TTARefresher: TTARefresher.TTARefresherProxy\u003cSelf\u003e.Type \n    \n\t/// Refresher Header    \n    public var header: TTARefresher.TTARefresherHeader?\n\t\n\t/// Refresher Footer\n    public var footer: TTARefresher.TTARefresherFooter?\n    \n    /// Data Count in total\n    public var totalDataCount: Int\n\n**\u003ca name=\"Refresher_States\"\u003e\u003c/a\u003eRefresher States**\n\n\t\tpublic enum TTARefresherState : Int {\n\t\t\t/// Normal State\n\t\t    case idle\n\n\t\t    case pulling\n\n\t\t    case refreshing\n\n\t\t    case willRefresh\n\t\t    \n\t\t    case noMoreData\n\t\t}\n\n**\u003ca name=\"TTARefresherComponent\"\u003e\u003c/a\u003eTTARefresherComponent**\n\n\t\t/// Refresher State\n\t\topen var state: TTARefresher.TTARefresherState\n\t\t\n\t\t/// Whether the Refresher is Refreshing\n\t\tpublic var isRefreshing: Bool\n\t\t\n\t\t/// Current pulling Percentage\n   \t\topen var pullingPercent: CGFloat\n\t\t\n\t\t/// Whether Auto Change the Refresher Alpha\n\t\tpublic var isAutoChangeAlpha: Bool\n\n    \t/// The Refresher's superView, Readonly for subviews\n    \tpublic fileprivate(set) var scrollView: UIScrollView?\n\n    \t/// The ScrollView Original inset, Readonly for subviews\n    \tpublic internal(set) var scrollViewOriginalInset: UIEdgeInsets\n    \t\n    \t/// Refresher Targer\n    \tpublic var refreshingTarget: AnyObject?\n\t\t\n\t\t/// Refresher Action\n    \tpublic var refreshingAction: Selector?\n\t\t\n\t\t/// Refresher Handler\n    \tpublic var refreshingHandler: TTARefresher.TTARefresherComponentRefreshingHandler?\n    \t\n\t\t/// Excuate While Begin Refreshing Completed\n    \tpublic var beginRefreshingCompletionHandler: TTARefresher.TTARefresherComponentBeginCompletionHandler?\n\t\t\n\t\t/// Excuate While End Refreshing Completed\n    \tpublic var endRefreshingCompletionHandler: TTARefresher.TTARefresherComponentEndCompletionHandler?\n\n    \t/// Set Refreshing Target and Action\n    \tpublic func setRefreshingTarget(aTarget: AnyObject, anAction: Selector)\n\t\n\t\t/// Begin Refreshing\n    \tpublic func beginRefreshing(_ completionHandler: TTARefresher.TTARefresherComponentBeginCompletionHandler? = default)\n    \t\n\t\t/// End Refreshing\n    \tpublic func endRefreshing(_ completionHandler: TTARefresher.TTARefresherComponentEndCompletionHandler? = default)\n    \t\n\n**\u003ca name=\"TTARefresherStateHeader\"\u003e\u003c/a\u003eTTARefresherStateHeader**  \t\n\n\t\t/// Refresher Header State Label\n\t\tlazy public var stateLabel: UILabel\n\t\t\n\t\t/// Refresher Header Time Label\n\t\tpublic var lastUpdatedTimeLabel: UILabel\n\n    \t/// The margin between Label and left images\n    \tpublic var labelLeftInset: CGFloat\n\t\t\n\t\t/// Set Custom Titles for State\n\t\tpublic func set(title: String, for state: TTARefresher.TTARefresherState)\n\t\t\n**\u003ca name=\"TTARefresherFooter\"\u003e\u003c/a\u003eTTARefresherFooter**\n   \t\n    \t/// If true, the footer will be shown when there are data, otherwise, footer will be hidden\n    public var isAutoHidden: Bool\n\t\n\t\t/// The ContentInset Bottom to ignore\n    \tpublic var ignoredScrollViewContentInsetBottom: CGFloat\n    \t\n    \t/// Rest Refresher state `.noMoreData` to `.idle`\n    \tpublic func resetNoMoreData()\n    \t\n    \t/// End Refresher and Set State With `.noMoreData`\n    \tpublic func endRefreshWithNoMoreData()\n\n**\u003ca name=\"TTARefresherAutoFooter\"\u003e\u003c/a\u003e\u003ca name=\"TTARefresherBackFooter\"\u003e\u003c/a\u003eTTARefresherAutoFooter \u0026 TTARefresherBackFooter**\n\n\t\t/// Whether Footer Auto Refresh\n\t\tpublic var isAutoRefresh: Bool\n\t\t\n\t\t/// The percent when the footer appear will get refresh, default is 1.0\n    \tpublic var triggerAutoRefreshPercent: CGFloat\n    \t\n    \t/// Whether Hide Footer\n    \topen var isHidden: Bool\n   \n**\u003ca name=\"TTARefresherAutoStateFoote\"\u003e\u003c/a\u003e\u003ca name=\"TTARefresherBackStateFooter\"\u003e\u003c/a\u003eTTARefresherAutoStateFoote \u0026 TTARefresherBackStateFooter** \n\t\n\t\t/// State Label\n\t\topen var stateLabel: UILabel\n\t\t\n\t\t/// Set Custom Titles for state\n\t\tpublic func set(title: String, for state: TTARefresher.TTARefresherState)\n\t\t\n\t\t/// Title for state\n\t\tpublic func title(for state: TTARefresher.TTARefresherState) -\u003e String?\n    \t\n**\u003ca name=\"TTARefresherAutoNormalFooter\"\u003e\u003c/a\u003e\u003ca name=\"TTARefresherBackNormalFooter\"\u003e\u003c/a\u003e\u003ca name=\"TTARefresherNormalHeader\"\u003e\u003c/a\u003eTTARefresherAutoNormalFooter \u0026 TTARefresherBackNormalFooter \u0026 TTARefresherNormalHeader**\n\t\n\t\t/// Refresher Footer/ Header Indicator Style, default is `.gray`\n\t\tpublic var indicatorStyle: UIActivityIndicatorViewStyle\n\t\t\n\t\t/// Back Normal Footer's Arrow Image View\n\t\tpublic var arrowImageView: UIImageView\n\t\t\n**\u003ca name=\"TTARefresherAutoGifFooter\"\u003e\u003c/a\u003e\u003ca name=\"TTARefresherBackGifFooter\"\u003e\u003c/a\u003e\u003ca name=\"TTARefresherGifHeader\"\u003e\u003c/a\u003eTTARefresherAutoGifFooter \u0026 TTARefresherBackGifFooter \u0026 TTARefresherGifHeader**\n\t\t\n\t\t/// Gif Image View\n\t\topen var gifImageView: UIImageView\n\t\t\n\t\t/// Set Images And Animation Time for State\n\t\tpublic func set(images: [UIImage]?, duration: TimeInterval?, for state: TTARefresher.TTARefresherState)\n\t\n\t\t/// Set Images For State, Default Time is `images.count * 0.1`\n    \tpublic func set(images: [UIImage]?, for state: TTARefresher.TTARefresherState)\n\n\t\t\n\n```\n\nextension TTARefresherComponent {\n\n    open func prepare()\n\n    open func placeSubviews()\n\n    open func scrollViewContentSizeDidChange(_ change: [NSKeyValueChangeKey : Any]?)\n\n    open func scrollViewContentOffsetDidChange(_ change: [NSKeyValueChangeKey : Any]?)\n\n    open func scrollViewPanStateDidChange(_ change: [NSKeyValueChangeKey : Any]?)\n}\n\n```\n\n## \u003ca name=\"How_to_use\"\u003e\u003c/a\u003eHow to use \n\t \n### \u003ca name=\"Header\"\u003e\u003c/a\u003eHeader\n---- \n#### \u003ca name=\"Default Header\"\u003e\u003c/a\u003eDefault Header\n\n\t    let header = TTARefresherNormalHeader {\n\t        self.loadNew()\n\t    }\n\t   // or\n\t   let header = TTARefresherNormalHeader(refreshingTarget: self, refreshingAction: #selector(loadNew))\n![Default Header][image-5]\n\n#### \u003ca name=\"Gif Header\"\u003e\u003c/a\u003eGif Header\n\n\t    let header = TTARefresherGifHeader {\n\t        self.loadNew()\n\t    }\n\t   // or\n\t    let header = TTARefresherGifHeader(refreshingTarget: self, refreshingAction: #selector(loadNew))\n\t   // The margin between label and images\n\t   header.labelLeftInset = 10\n\t   let (idleImages, refreshingImages) = prepareAnimationImages()\n\t   header.set(images: idleImages, for: .idle)\n\t   header.set(images: refreshingImages, for: .refreshing)\n![Gif Header][image-6]\n\n#### \u003ca name=\"Header Hide Time\"\u003e\u003c/a\u003eHeader Hide Time\n\n\t    header.lastUpdatedTimeLabel.isHidden = true\n\n![Header Hide Time][image-7]\n\n\n#### \u003ca name=\"Header Hide Time And State\"\u003e\u003c/a\u003eHeader Hide Time And State\n\t \n\t    header.stateLabel.isHidden = true\n\t    header.lastUpdatedTimeLabel.isHidden = true\n\t\t \n![Header Hide Time And State][image-8]\n\t\t \n#### \u003ca name=\"Header Custom Text\"\u003e\u003c/a\u003eHeader Custom Text\n\n\t    header.set(title: \"Pull Me Down\", for: .idle)\n\t    header.set(title: \"Release Me To Refresh\", for: .pulling)\n\t    header.set(title: \"Come on, I'm getting the data\", for: .refreshing)\n\t\t \n![Header Hide Time And State][image-9]\n\t \n### \u003ca name=\"Footer\"\u003e\u003c/a\u003eFooter\n\n---- \n\n#### \u003ca name=\"Footer Default Auto\"\u003e\u003c/a\u003eFooter Default Auto\n\n\t    let footer = TTARefresherAutoNormalFooter {\n\t        self.loadMore()\n\t    }\n\t   // or\n\t   let footer  = TTARefresherAutoNormalFooter(refreshingTarget: self, refreshingAction: #selector(endLoadMore))\n\n![Footer Default Auto](/gif/TTARefresher_default_auto_footer.gif)\n\n#### \u003ca name=\"Auto Gif Footer\"\u003e\u003c/a\u003eAuto Gif Footer\n\n\t    let footer = TTARefresherAutoGifFooter {\n\t        self.loadMore()\n\t    }\n\t   // or\n\t    let footer = TTARefresherAutoGifFooter(refreshingTarget: self, refreshingAction: #selector(loadMore))\n\t    let (idleImages, refreshingImages) = prepareAnimationImages()\n\t    footer.set(images: idleImages, for: .idle)\n\t    footer.set(images: refreshingImages, for: .refreshing)\n\t    \n![Auto Gif Footer](https://github.com/TMTBO/TTARefresher/blob/master/gif/TTARefresher_default_auto_gif_footer.gif)\n\n\n#### \u003ca name=\"Back Footer\"\u003e\u003c/a\u003eBack Footer\n\n\t\tlet footer = TTARefresherBackNormalFooter {\n            self.loadMore()\n        }\n        // or\n\t    let footer = TTARefresherBackNormalFooter(refreshingTarget: self, refreshingAction: #selector(loadMore))\n\n![Back Footer](https://github.com/TMTBO/TTARefresher/blob/master/gif/TTARefresher_default_back_footer.gif)\n\n#### \u003ca name=\"Auto Gif Hide State\"\u003e\u003c/a\u003eAuto Gif Hide State\n\n\t\tfooter.stateLabel.isHidden = true\n\t\t\n![Auto Gif Hide State](https://github.com/TMTBO/TTARefresher/blob/master/gif/TTARefresher_default_auto_gif_footer_hide_state.gif)\n\n---- \n\n## \u003ca name=\"Author\"\u003e\u003c/a\u003eAuthor\n\nTobyoTenma, tmtbo@hotmail.com\n\n## \u003ca name=\"License\"\u003e\u003c/a\u003eLicense\n\nTTARefresher is available under the MIT license. See the LICENSE file for more info.\n\n[1]:\thttps://travis-ci.org/TMTBO/TTARefresher\n[2]:\thttp://cocoapods.org/pods/TTARefresher\n[3]:\thttp://cocoapods.org/pods/TTARefresher\n[4]:\thttp://cocoapods.org/pods/TTARefresher\n[5]:\thttp://cocoapods.org\n\n[image-1]:\thttp://img.shields.io/travis/TMTBO/TTARefresher.svg?style=flat\n[image-2]:\thttps://img.shields.io/cocoapods/v/TTARefresher.svg?style=flat\n[image-3]:\thttps://img.shields.io/cocoapods/l/TTARefresher.svg?style=flat\n[image-4]:\thttps://img.shields.io/cocoapods/p/TTARefresher.svg?style=flat\n[image-5]:\thttps://github.com/TMTBO/TTARefresher/blob/master****/gif/TTARefresher_default_header.gif\n[image-6]:\thttps://github.com/TMTBO/TTARefresher/blob/master/gif/TTARefresher_gif_header.gif\n[image-7]:\thttps://github.com/TMTBO/TTARefresher/blob/master/gif/TTARefresher_default_header_hide_time_lable.gif\n[image-8]:\thttps://github.com/TMTBO/TTARefresher/blob/master/gif/TTARefresher_gif_header_hide_time_and_state.gif\n[image-9]:\thttps://github.com/TMTBO/TTARefresher/blob/master/gif/TTARefresher_default_header_custom_text.gif\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftmtbo%2Fttarefresher","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftmtbo%2Fttarefresher","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftmtbo%2Fttarefresher/lists"}