{"id":13696501,"url":"https://github.com/12207480/TYPagerController","last_synced_at":"2025-05-03T17:31:28.432Z","repository":{"id":53585351,"uuid":"59122576","full_name":"12207480/TYPagerController","owner":"12207480","description":"page scroll view and controller,simple,high custom,and have many tabBar styles,,support Objective-C and swift","archived":false,"fork":false,"pushed_at":"2021-03-23T03:59:26.000Z","size":4425,"stargazers_count":1374,"open_issues_count":56,"forks_count":231,"subscribers_count":26,"default_branch":"master","last_synced_at":"2025-04-08T11:11:46.450Z","etag":null,"topics":["pager","pager-controller"],"latest_commit_sha":null,"homepage":"","language":"Objective-C","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/12207480.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":"2016-05-18T14:23:06.000Z","updated_at":"2025-03-18T03:29:23.000Z","dependencies_parsed_at":"2022-08-20T22:10:05.540Z","dependency_job_id":null,"html_url":"https://github.com/12207480/TYPagerController","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/12207480%2FTYPagerController","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/12207480%2FTYPagerController/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/12207480%2FTYPagerController/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/12207480%2FTYPagerController/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/12207480","download_url":"https://codeload.github.com/12207480/TYPagerController/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252226736,"owners_count":21714861,"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":["pager","pager-controller"],"created_at":"2024-08-02T18:00:41.419Z","updated_at":"2025-05-03T17:31:24.939Z","avatar_url":"https://github.com/12207480.png","language":"Objective-C","funding_links":[],"categories":["UI Components","Objective-C"],"sub_categories":[],"readme":"# TYPagerController v2.0\nTYPagerController 简单，强大，高度定制，页面控制器,水平滚动内容和标题栏,包含多种barStyle。\u003cbr\u003e\nTYPagerController v2.0 重构优化代码，分离出TYPagerViewLayout布局类,添加更多功能，更加强大，稳定，已经在项目中使用\u003cbr\u003e\n如果还想使用以前的版本可以查看分支v1.0.6 和 pod 'TYPagerController', '~\u003e 1.0.6' \u003cbr\u003e\n\n* TYPagerViewLayout 水平滚动页面的layout类，只需要initWithScrollView:即可实现水平滚动页面.\n* TYPagerView 包含TYPagerViewLayout的水平滚动页面View\n* TYPagerController 包含TYPagerViewLayout的水平滚动页面Controller。\n* TYTabPagerBar Pager的标题 tabBar\n* TYTabPagerView 包含TabBar的TYPagerView\n* TYTabPagerController 包含TabBar的TYPagerController\n\n注意：获取数据后必须调用reloadData.\u003cbr\u003e\n更详细的使用请看[LovePlayNews](https://github.com/12207480/LovePlayNews)项目\n\n## CocoaPods\n```\npod 'TYPagerController'\n```\n\n## Requirements\n* Xcode 7 or higher\n* iOS 7.0 or higher\n* ARC\n\n## ScreenShot\n### TYPagerBarStyle\n\nNew TYPagerBarStyleProgressElasticView\u003cbr\u003e\n![image](https://github.com/12207480/TYPagerController/blob/master/ScreenShot/TYPagerController6.gif)\n\n1 TYPagerBarStyleProgressBounceView\u003cbr\u003e\n![image](https://raw.githubusercontent.com/12207480/TYPagerController/master/ScreenShot/TYPagerController1.gif)\n\n2 TYPagerBarStyleProgressView\u003cbr\u003e\n![image](https://raw.githubusercontent.com/12207480/TYPagerController/master/ScreenShot/TYPagerController2.gif)\n\n3 TYPagerBarStyleCoverView\u003cbr\u003e\n![image](https://raw.githubusercontent.com/12207480/TYPagerController/master/ScreenShot/TYPagerController3.gif)\n![image](https://raw.githubusercontent.com/12207480/TYPagerController/master/ScreenShot/TYPagerController7.gif)\n\n4 TYPagerBarStyleNoneView\u003cbr\u003e\n![image](https://raw.githubusercontent.com/12207480/TYPagerController/master/ScreenShot/TYPagerController4.gif)\n\n## API\n\n### Class\n* TYPagerViewLayout\n```objc\n@interface TYPagerViewLayout\u003c__covariant ItemType\u003e : NSObject\n\n@property (nonatomic, weak, nullable) id\u003cTYPagerViewLayoutDataSource\u003e dataSource;\n@property (nonatomic, weak, nullable) id\u003cTYPagerViewLayoutDelegate\u003e delegate;\n\n// strong,will control the delegate,don't set delegate on other place.\n@property (nonatomic, strong, readonly) UIScrollView *scrollView;\n// if viewcontroller's automaticallyAdjustsScrollViewInsets YES ,will cause frame problems, you can set YES, default YES\n@property (nonatomic, assign) BOOL adjustScrollViewInset;\n\n@property (nonatomic, assign, readonly) NSInteger countOfPagerItems;\n@property (nonatomic, assign, readonly) NSInteger curIndex;// default -1\n\n@property (nonatomic, strong, readonly) NSCache\u003cNSNumber *,ItemType\u003e *memoryCache;; // will cache pagerView,you can set countLimit\n@property (nonatomic, assign) BOOL autoMemoryCache; // default YES\n\n@property (nonatomic, assign) NSInteger prefetchItemCount;// preload left and right item's count , default 0\n\n@property (nonatomic, assign, readonly) NSRange prefetchRange;\n@property (nonatomic, assign, readonly) NSRange visibleRange;\n\n@property (nonatomic, strong, nullable, readonly) NSArray\u003cNSNumber *\u003e * visibleIndexs;\n@property (nonatomic, strong, nullable, readonly) NSArray\u003cItemType\u003e * visibleItems;\n\n// default YES, if NO,will not call delegate transitionFromIndex:toIndex:progress:,but will call transitionFromIndex:toIndex:\n@property (nonatomic, assign) BOOL progressAnimateEnabel;\n\n// default NO, when scroll visible range change will add item.If YES add item only when scroll animate end, suggest set prefetchItemCount 1 or more\n@property (nonatomic, assign) BOOL addVisibleItemOnlyWhenScrollAnimatedEnd;\n\n// default 0.5,when scroll progress percent will change index, only progressAnimateEnabel is NO or don't implement delegate transitionFromIndex: toIndex: progress:\n@property (nonatomic, assign) CGFloat changeIndexWhenScrollProgress;\n```\n* TYPagerView\n```objc\n@interface TYPagerView : UIView\n\n@property (nonatomic, weak, nullable) id\u003cTYPagerViewDataSource\u003e dataSource;\n@property (nonatomic, weak, nullable) id\u003cTYPagerViewDelegate\u003e delegate;\n// pagerView's layout,don't set layout's dataSource to other\n@property (nonatomic, strong, readonly) TYPagerViewLayout\u003cUIView *\u003e *layout;\n@property (nonatomic, strong, readonly) UIScrollView *scrollView;\n\n@property (nonatomic, assign, readonly) NSInteger countOfPagerViews;\n@property (nonatomic, assign, readonly) NSInteger curIndex;// default -1\n\n@property (nonatomic, assign, nullable, readonly) NSArray\u003cUIView *\u003e *visibleViews;\n\n@property (nonatomic, assign) UIEdgeInsets contentInset;\n\n//if not visible, prefecth, cache view at index, return nil\n- (UIView *_Nullable)viewForIndex:(NSInteger)index;\n\n// register \u0026\u0026 dequeue's usage like tableView\n- (void)registerClass:(Class)Class forViewWithReuseIdentifier:(NSString *)identifier;\n- (void)registerNib:(UINib *)nib forViewWithReuseIdentifier:(NSString *)identifier;\n- (UIView *)dequeueReusableViewWithReuseIdentifier:(NSString *)identifier forIndex:(NSInteger)index;\n\n// scroll to index\n- (void)scrollToViewAtIndex:(NSInteger)index animate:(BOOL)animate;\n\n// update data and layout,but don't reset propertys(curIndex,visibleDatas,prefechDatas)\n- (void)updateData;\n\n// reload data and reset propertys\n- (void)reloadData;\n```\n```objc\n@protocol TYTabPagerControllerDelegate \u003cTYPagerControllerDelegate\u003e\n\n// configre collectionview cell\n- (void)pagerController:(TYTabPagerController *)pagerController configreCell:(UICollectionViewCell *)cell forItemTitle:(NSString *)title atIndexPath:(NSIndexPath *)indexPath;\n\n// transition frome cell to cell with animated\n- (void)pagerController:(TYTabPagerController *)pagerController transitionFromeCell:(UICollectionViewCell *)fromCell toCell:(UICollectionViewCell *)toCell animated:(BOOL)animated;\n\n// transition frome cell to cell with progress\n- (void)pagerController:(TYTabPagerController *)pagerController transitionFromeCell:(UICollectionViewCell *)fromCell toCell:(UICollectionViewCell *)toCell progress:(CGFloat)progress;\n\n@end\n```\n* TYPagerController\n```objc\n@interface TYPagerController : UIViewController\n\n@property (nonatomic, weak, nullable) id\u003cTYPagerControllerDataSource\u003e dataSource;\n@property (nonatomic, weak, nullable) id\u003cTYPagerControllerDelegate\u003e   delegate;\n// pagerController's layout,don't set layout's dataSource to other\n@property (nonatomic, strong, readonly) TYPagerViewLayout\u003cUIViewController *\u003e *layout;\n@property (nonatomic, weak, readonly) UIScrollView *scrollView;\n\n@property (nonatomic, assign, readonly) NSInteger countOfControllers;\n@property (nonatomic, assign, readonly) NSInteger curIndex;// default -1\n\n@property (nonatomic, strong, nullable, readonly) NSArray\u003cUIViewController *\u003e *visibleControllers;\n\n@property (nonatomic, assign) UIEdgeInsets contentInset;\n\n//if not visible, prefecth, cache view at index, return nil\n- (UIViewController *_Nullable)controllerForIndex:(NSInteger)index;\n\n// register \u0026\u0026 dequeue's usage like tableView\n- (void)registerClass:(Class)Class forControllerWithReuseIdentifier:(NSString *)identifier;\n- (void)registerNib:(UINib *)nib forControllerWithReuseIdentifier:(NSString *)identifier;\n- (UIViewController *)dequeueReusableControllerWithReuseIdentifier:(NSString *)identifier forIndex:(NSInteger)index;\n\n// scroll to index\n- (void)scrollToControllerAtIndex:(NSInteger)index animate:(BOOL)animate;\n\n//  update data and layout,but don't reset propertys(curIndex,visibleDatas,prefechDatas)\n- (void)updateData;\n\n// reload data and reset propertys\n- (void)reloadData;\n```\n\n##Usage Demo\n* TYTabPagerView\n```objc\n- (void)addTabPagerView {\n    TYTabPagerView *pagerView = [[TYTabPagerView alloc]init];\n    pagerView.tabBar.layout.barStyle = TYPagerBarStyleCoverView;\n    pagerView.tabBar.progressView.backgroundColor = [UIColor lightGrayColor];\n    pagerView.dataSource = self;\n    pagerView.delegate = self;\n    [self.view addSubview:pagerView];\n    _pagerView = pagerView;\n}\n\n#pragma mark - TYTabPagerViewDataSource\n\n- (NSInteger)numberOfViewsInTabPagerView {\n    return _datas.count;\n}\n\n- (UIView *)tabPagerView:(TYTabPagerView *)tabPagerView viewForIndex:(NSInteger)index prefetching:(BOOL)prefetching {\n    UIView *view = [[UIView alloc]initWithFrame:[tabPagerView.layout frameForItemAtIndex:index]];\n    view.backgroundColor = [UIColor colorWithRed:arc4random()%255/255.0 green:arc4random()%255/255.0 blue:arc4random()%255/255.0 alpha:arc4random()%255/255.0];\n    //NSLog(@\"viewForIndex:%ld prefetching:%d\",index,prefetching);\n    return view;\n}\n\n- (NSString *)tabPagerView:(TYTabPagerView *)tabPagerView titleForIndex:(NSInteger)index {\n    NSString *title = _datas[index];\n    return title;\n}\n```\n\n* TYTabPagerController\n```objc\n@interface TabPagerControllerDemoController : TYTabPagerController\n\n- (void)viewDidLoad {\n    [super viewDidLoad];\n    // Do any additional setup after loading the view.\n    self.title = @\"TabPagerControllerDemoController\";\n    self.tabBar.layout.barStyle = TYPagerBarStyleProgressView;\n    self.dataSource = self;\n    self.delegate = self;\n    \n    [self loadData];\n}\n\n- (void)loadData {\n    _datas = [datas copy];\n    // must call reloadData\n    [self reloadData];\n}\n\n#pragma mark - TYTabPagerControllerDataSource\n\n- (NSInteger)numberOfControllersInTabPagerController {\n    return _datas.count;\n}\n\n- (UIViewController *)tabPagerController:(TYTabPagerController *)tabPagerController controllerForIndex:(NSInteger)index prefetching:(BOOL)prefetching {\n    if (index%3 == 0) {\n        CustomViewController *VC = [[CustomViewController alloc]init];\n        VC.text = [@(index) stringValue];\n        return VC;\n    }else if (index%3 == 1) {\n        ListViewController *VC = [[ListViewController alloc]init];\n        VC.text = [@(index) stringValue];\n        return VC;\n    }else {\n        CollectionViewController *VC = [[CollectionViewController alloc]init];\n        VC.text = [@(index) stringValue];\n        return VC;\n    }\n}\n\n- (NSString *)tabPagerController:(TYTabPagerController *)tabPagerController titleForIndex:(NSInteger)index {\n    NSString *title = _datas[index];\n    return title;\n}\n```\n\n\n更多的使用方法 请查看 demo。\n\n### Contact\n如果你发现bug，please pull reqeust me \u003cbr\u003e\n如果你有更好的改进，please pull reqeust me \u003cbr\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F12207480%2FTYPagerController","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F12207480%2FTYPagerController","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F12207480%2FTYPagerController/lists"}