1- # TYPagerController
2- page View controller,simple,high custom,and have tabBar styles.<br >
3- TYPagerController 简单,支持定制,页面控制器,可以滚动内容和标题栏,包含多种style
4-
5- * TYPagerController 水平滚动页面控制器,不包含任何其他的控件(TabBar),contentTopEdging 为距离top的高度。
6- * TYTabPagerController 包含TabBar(我帮你创建了Tabbar),contentTopEdging为TabBar的高度,调用registerCellClass 注册cell(遵守TYTabTitleCellProtocol),然后在代理方法里改变cell。
7- * TYTabButtonPagerController 同上,默认注册了TYTabTitleViewCell
1+ # TYPagerController v2.0
2+ TYPagerController 简单,强大,高度定制,页面控制器,水平滚动内容和标题栏,包含多种barStyle。<br >
3+ TYPagerController v2.0 重构优化代码,分离出TYPagerViewLayout布局类,添加更多功能,更加强大。<br >
4+ 如果还想使用以前的版本可以查看分支v1.0.6 和 pod 'TYPagerController', '~ > 1.0.6' <br >
5+
6+ * TYPagerViewLayout 水平滚动页面的layout类,只需要initWithScrollView:即可实现水平滚动页面.
7+ * TYPagerView 包含TYPagerViewLayout的水平滚动页面View
8+ * TYPagerController 包含TYPagerViewLayout的水平滚动页面Controller。
9+ * TYTabPagerBar Pager的标题 tabBar
10+ * TYTabPagerView 包含TabBar的TYPagerView
11+ * TYTabPagerController 包含TabBar的TYPagerController
812
913更详细的使用请看[ LovePlayNews] ( https://github.com/12207480/LovePlayNews ) 项目
1014
1115## CocoaPods
1216```
13- pod 'TYPagerController'
17+ pod 'TYPagerController' , '~> 2.0.1'
1418```
1519
1620## Requirements
17- * Xcode 5 or higher
18- * iOS 6 .0 or higher
21+ * Xcode 7 or higher
22+ * iOS 7 .0 or higher
1923* ARC
2024
2125## ScreenShot
22- #### TYPagerBarStyle
26+ ### TYPagerBarStyle
2327
2428New TYPagerBarStyleProgressElasticView<br >
2529![ image] ( https://github.com/12207480/TYPagerController/blob/master/ScreenShot/TYPagerController6.gif )
@@ -32,42 +36,82 @@ New TYPagerBarStyleProgressElasticView<br>
3236
33373 TYPagerBarStyleCoverView<br >
3438![ image] ( https://raw.githubusercontent.com/12207480/TYPagerController/master/ScreenShot/TYPagerController3.gif )
39+ ![ image] ( https://raw.githubusercontent.com/12207480/TYPagerController/master/ScreenShot/TYPagerController7.gif )
3540
36414 TYPagerBarStyleNoneView<br >
3742![ image] ( https://raw.githubusercontent.com/12207480/TYPagerController/master/ScreenShot/TYPagerController4.gif )
3843
39- ![ image] ( https://raw.githubusercontent.com/12207480/TYPagerController/master/ScreenShot/TYPagerController5.gif )
40-
41- ## Datasource and delegate
44+ ## API
4245
46+ ### Class
47+ * TYPagerViewLayout
4348``` objc
44- @protocol TYPagerControllerDataSource < NSObject >
49+ @interface TYPagerViewLayout <__covariant ItemType> : NSObject
4550
46- // viewController count in pagerController
47- - (NSInteger)numberOfControllersInPagerController ;
51+ @property ( nonatomic , weak , nullable ) id< TYPagerViewLayoutDataSource > dataSource;
52+ @property ( nonatomic , weak , nullable ) id< TYPagerViewLayoutDelegate > delegate ;
4853
49- // viewController at index in pagerController
50- - (UIViewController * )pagerController:(TYPagerController * )pagerController controllerForIndex:(NSInteger)index;
54+ // strong,will control the delegate,don't set delegate on other place.
55+ @property (nonatomic , strong , readonly ) UIScrollView * scrollView;
56+ // if viewcontroller's automaticallyAdjustsScrollViewInsets YES ,will cause frame problems, you can set YES, default YES
57+ @property (nonatomic , assign ) BOOL adjustScrollViewInset;
5158
52- @optional
59+ @property (nonatomic , assign , readonly ) NSInteger countOfPagerItems;
60+ @property (nonatomic , assign , readonly ) NSInteger curIndex;// default -1
5361
54- // viewController title in pagerController
55- - (NSString * )pagerController:(TYPagerController * )pagerController titleForIndex:(NSInteger)index;
62+ @property ( nonatomic , strong , readonly ) NSCache<NSNumber * ,ItemType> * memoryCache;; // will cache pagerView,you can set countLimit
63+ @property ( nonatomic , assign ) BOOL autoMemoryCache; // default YES
5664
57- @end
65+ @property (nonatomic , assign ) NSInteger prefetchItemCount;// preload left and right item's count , default 0
66+
67+ @property (nonatomic , assign , readonly ) NSRange prefetchRange;
68+ @property (nonatomic , assign , readonly ) NSRange visibleRange;
69+
70+ @property (nonatomic , strong , nullable , readonly ) NSArray<NSNumber * > * visibleIndexs;
71+ @property (nonatomic , strong , nullable , readonly ) NSArray<ItemType > * visibleItems;
72+
73+ // default YES, if NO,will not call delegate transitionFromIndex:toIndex:progress:,but will call transitionFromIndex:toIndex:
74+ @property (nonatomic , assign ) BOOL progressAnimateEnabel;
75+
76+ // 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
77+ @property (nonatomic , assign ) BOOL addVisibleItemOnlyWhenScrollAnimatedEnd;
78+
79+ // default 0.5,when scroll progress percent will change index, only progressAnimateEnabel is NO or don't implement delegate transitionFromIndex: toIndex: progress:
80+ @property (nonatomic , assign ) CGFloat changeIndexWhenScrollProgress;
5881```
82+ * TYPagerView
5983```objc
60- @protocol TYPagerControllerDelegate <NSObject>
84+ @interface TYPagerView : UIView
6185
62- @optional
86+ @property (nonatomic, weak, nullable) id<TYPagerViewDataSource> dataSource;
87+ @property (nonatomic, weak, nullable) id<TYPagerViewDelegate> delegate;
88+ // pagerView's layout,don't set layout's dataSource to other
89+ @property (nonatomic, strong, readonly) TYPagerViewLayout<UIView *> *layout;
90+ @property (nonatomic, strong, readonly) UIScrollView *scrollView;
6391
64- // transition from index to index with animated
65- - (void)pagerController:(TYPagerController *)pagerController transitionFromIndex:(NSInteger)formIndex toIndex:( NSInteger)toIndex animated:(BOOL)animated;
92+ @property (nonatomic, assign, readonly) NSInteger countOfPagerViews;
93+ @property (nonatomic, assign, readonly) NSInteger curIndex;// default -1
6694
67- // transition from index to index with progress
68- - (void)pagerController:(TYPagerController *)pagerController transitionFromIndex:(NSInteger)formIndex toIndex:(NSInteger)toIndex progress:(CGFloat)progress;
95+ @property (nonatomic, assign, nullable, readonly) NSArray<UIView *> *visibleViews;
6996
70- @end
97+ @property (nonatomic, assign) UIEdgeInsets contentInset;
98+
99+ //if not visible, prefecth, cache view at index, return nil
100+ - (UIView *_Nullable)viewForIndex:(NSInteger)index;
101+
102+ // register && dequeue's usage like tableView
103+ - (void)registerClass:(Class)Class forViewWithReuseIdentifier:(NSString *)identifier;
104+ - (void)registerNib:(UINib *)nib forViewWithReuseIdentifier:(NSString *)identifier;
105+ - (UIView *)dequeueReusableViewWithReuseIdentifier:(NSString *)identifier forIndex:(NSInteger)index;
106+
107+ // scroll to index
108+ - (void)scrollToViewAtIndex:(NSInteger)index animate:(BOOL)animate;
109+
110+ // update data and layout,but don't reset propertys(curIndex,visibleDatas,prefechDatas)
111+ - (void)updateData;
112+
113+ // reload data and reset propertys
114+ - (void)reloadData;
71115```
72116``` objc
73117@protocol TYTabPagerControllerDelegate <TYPagerControllerDelegate>
@@ -83,102 +127,95 @@ New TYPagerBarStyleProgressElasticView<br>
83127
84128@end
85129```
86- ##Usage Demo
130+ * TYPagerController
131+ ```objc
132+ @interface TYPagerController : UIViewController
87133
88- if you want to add coustom TabBar, you can inherit TYPagerController,and set contentTopEdging,else you can inherit TYTabPagerController or TYTabButtonPagerController,set contentTopEdging(TabBar height) and custom cell(conform TYTabTitleCellProtocol), call registerCellClass, change cell on delegate.<br>
134+ @property (nonatomic, weak, nullable) id<TYPagerControllerDataSource> dataSource;
135+ @property (nonatomic, weak, nullable) id<TYPagerControllerDelegate> delegate;
136+ // pagerController's layout,don't set layout's dataSource to other
137+ @property (nonatomic, strong, readonly) TYPagerViewLayout<UIViewController *> *layout;
138+ @property (nonatomic, weak, readonly) UIScrollView *scrollView;
89139
90- 如果你想自己添加TabBar,你可以继承TYPagerController 然后设置 contentTopEdging ,留出高度添加TabBar,你也可以 直接继承 TYTabPagerController或者TYTabButtonPagerController 设置contentTopEdging(TabBar height) ,我帮你创建了Tabbar,你只要调用registerCellClass 注册cell(遵守TYTabTitleCellProtocol),然后在代理方法里改变cell。<br>
140+ @property (nonatomic, assign, readonly) NSInteger countOfControllers;
141+ @property (nonatomic, assign, readonly) NSInteger curIndex;// default -1
91142
92- 关于默认index,可以再viewdidload中调用<br>
93- ```objc
94- // 默认第2页 注意:pagerController 默认自动调用reloadData的时机,是在viewWillAppear和viewWillLayoutSubviews 而viewDidLoad至此之前,所以需要手动调用reloadData
95- [_pagerController reloadData];
96- [_pagerController moveToControllerAtIndex:1 animated:NO];
97- ```
98- 更多的使用方法 请查看 demo。
143+ @property (nonatomic, strong, nullable, readonly) NSArray<UIViewController *> *visibleControllers;
144+
145+ @property (nonatomic, assign) UIEdgeInsets contentInset;
146+
147+ //if not visible, prefecth, cache view at index, return nil
148+ - (UIViewController *_Nullable)controllerForIndex:(NSInteger)index;
99149
100- * ** first method**
150+ // register && dequeue's usage like tableView
151+ - (void)registerClass:(Class)Class forControllerWithReuseIdentifier:(NSString *)identifier;
152+ - (void)registerNib:(UINib *)nib forControllerWithReuseIdentifier:(NSString *)identifier;
153+ - (UIViewController *)dequeueReusableControllerWithReuseIdentifier:(NSString *)identifier forIndex:(NSInteger)index;
101154
155+ // scroll to index
156+ - (void)scrollToControllerAtIndex:(NSInteger)index animate:(BOOL)animate;
157+
158+ // update data and layout,but don't reset propertys(curIndex,visibleDatas,prefechDatas)
159+ - (void)updateData;
160+
161+ // reload data and reset propertys
162+ - (void)reloadData;
163+ ```
164+
165+ ##Usage Demo
166+ * TYTabPagerView
102167``` objc
103- // add pagerController
104- - (void )addPagerController
105- {
106- TYTabButtonPagerController *pagerController = [[TYTabButtonPagerController alloc]init];
107- pagerController.dataSource = self;
108- pagerController.adjustStatusBarHeight = YES;
109- //pagerController.cellWidth = 56;
110- pagerController.cellSpacing = 8;
111- pagerController.barStyle = _variable ? TYPagerBarStyleProgressBounceView: TYPagerBarStyleProgressView;
112-
113- pagerController.view.frame = self.view.bounds;
114- [self addChildViewController:pagerController];
115- [self.view addSubview:pagerController.view];
116- _pagerController = pagerController;
168+ - (void )addTabPagerView {
169+ TYTabPagerView *pagerView = [[TYTabPagerView alloc]init];
170+ pagerView.tabBar.layout.barStyle = TYPagerBarStyleCoverView;
171+ pagerView.tabBar.progressView.backgroundColor = [UIColor lightGrayColor];
172+ pagerView.dataSource = self;
173+ pagerView.delegate = self;
174+ [self.view addSubview:pagerView];
175+ _pagerView = pagerView;
117176}
118177
119- #pragma mark - TYPagerControllerDataSource
178+ #pragma mark - TYTabPagerViewDataSource
120179
121- - (NSInteger )numberOfControllersInPagerController
122- {
123- return 30;
180+ - (NSInteger )numberOfViewsInTabPagerView {
181+ return _datas.count;
124182}
125183
126- - (NSString *)pagerController:(TYPagerController *)pagerController titleForIndex:(NSInteger )index
127- {
128- return index %2 == 0 ? [NSString stringWithFormat:@"Tab %ld",index]:[NSString stringWithFormat:@"Tab Tab %ld",index];
184+ - (UIView *)tabPagerView:(TYTabPagerView *)tabPagerView viewForIndex:(NSInteger )index prefetching:(BOOL )prefetching {
185+ UIView *view = [[UIView alloc]initWithFrame:[tabPagerView.layout frameForItemAtIndex:index]];
186+ view.backgroundColor = [UIColor colorWithRed:arc4random()%255/255.0 green:arc4random()%255/255.0 blue:arc4random()%255/255.0 alpha:arc4random()%255/255.0];
187+ //NSLog(@"viewForIndex:%ld prefetching:%d",index,prefetching);
188+ return view;
129189}
130190
131- - (UIViewController *)pagerController:(TYPagerController *)pagerController controllerForIndex:(NSInteger )index
132- {
133- if (index%3 == 0) {
134- CustomViewController *VC = [[CustomViewController alloc]init];
135- VC.text = [@(index) stringValue];
136- return VC;
137- }else if (index%3 == 1) {
138- ListViewController *VC = [[ListViewController alloc]init];
139- VC.text = [@(index) stringValue];
140- return VC;
141- }else {
142- CollectionViewController *VC = [[CollectionViewController alloc]init];
143- VC.text = [@(index) stringValue];
144- return VC;
145- }
191+ - (NSString *)tabPagerView:(TYTabPagerView *)tabPagerView titleForIndex:(NSInteger )index {
192+ NSString *title = _datas[index];
193+ return title;
146194}
147-
148195```
149196
150- * ** second method**
151-
197+ * TYTabPagerController
152198``` objc
153- @interface CustomPagerController : TYTabButtonPagerController
154-
155- @end
156-
157- @implementation CustomPagerController
199+ @interface TabPagerControllerDemoController : TYTabPagerController
158200
159201- (void)viewDidLoad {
160- // set bar style will reset progress propertys, set it behind [ super viewdidload]
161- self.barStyle = TYPagerBarStyleProgressBounceView;
162202 [ super viewDidLoad] ;
163203 // Do any additional setup after loading the view.
164- self.adjustStatusBarHeight = YES;
165- self.cellSpacing = 8;
204+ self.title = @"TabPagerControllerDemoController";
205+ self.tabBar.layout.barStyle = TYPagerBarStyleProgressView;
206+ self.dataSource = self;
207+ self.delegate = self;
208+
209+ [ self loadData] ;
166210}
167211
168- #pragma mark - TYPagerControllerDataSource
212+ #pragma mark - TYTabPagerControllerDataSource
169213
170- - (NSInteger)numberOfControllersInPagerController
171- {
172- return 30;
214+ - (NSInteger)numberOfControllersInTabPagerController {
215+ return _ datas.count;
173216}
174217
175- - (NSString * )pagerController:(TYPagerController * )pagerController titleForIndex:(NSInteger)index
176- {
177- return index %2 == 0 ? [ NSString stringWithFormat:@"Tab %ld",index] :[ NSString stringWithFormat:@"Tab Tab %ld",index] ;
178- }
179-
180- - (UIViewController * )pagerController:(TYPagerController * )pagerController controllerForIndex:(NSInteger)index
181- {
218+ - (UIViewController * )tabPagerController:(TYTabPagerController * )tabPagerController controllerForIndex:(NSInteger)index prefetching:(BOOL)prefetching {
182219 if (index%3 == 0) {
183220 CustomViewController * VC = [[ CustomViewController alloc] init] ;
184221 VC.text = [ @(index) stringValue] ;
@@ -194,9 +231,15 @@ if you want to add coustom TabBar, you can inherit TYPagerController,and set c
194231 }
195232}
196233
197- @end
198-
234+ - (NSString * )tabPagerController:(TYTabPagerController * )tabPagerController titleForIndex:(NSInteger)index {
235+ NSString * title = _ datas[ index] ;
236+ return title;
237+ }
199238```
239+
240+
241+ 更多的使用方法 请查看 demo。
242+
200243### Contact
201244如果你发现bug,please pull reqeust me <br>
202245如果你有更好的改进,please pull reqeust me <br>
0 commit comments