版本记录
版本号 | 时间 |
---|---|
V1.0 | 2017.12.31 |
前言
大家都知道UITableView这个控件是大家一定会用到的,使用的时候可以直接放在UIViewController里面实例化,也可以直接继承UITableViewController,如果采取后者方案会少写一些代码,比如实例化代码以及遵守代理和数据源代理方法,但是我还是不喜欢这么做,下面我就说一下我的原因。
使用UITableViewController的优缺点
1. 优点
使用UITableViewController
有很多优点,比如:
- 不用像在
UIViewController
里面那样实例化UITableView了。 - 不用写数据源和代理的遵守了
<UITableViewDelegate, UITableViewDataSource>
。因为系统已经给加好了。
NS_CLASS_AVAILABLE_IOS(2_0) @interface UITableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
2. 缺点
下面就说一下缺点,比如:
- 添加控件时候,由于根视图是UITableView,所以你没得选择,添加子视图,子视图就要跟随控件一起滚动,但是绝大多数情况,就是除了列表以外的控件时不能滚动的。如果想让UITableView子视图不滚动,就要监听
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
方法,获取scrollView.contentOffset
更新子控件的frame,这个在下面的例子会给出。先给出没解决之前的示意图。
- 在加载空视图后者断网的错误视图的时候,由于根视图是UITableView,如果你的返回section个数不为0的时候,你直接加一个断网视图放在UITableView上,就会出现断网视图在
sectionHeader
的下面的尴尬情况,一条条的sectionHeader就会把你的页面搞乱,非常烦人。这个时候你只能依靠返回那个section个数代理方法返回为0,并且reloadData,然后才可以让sectionHeader不显示,达到断网视图盖到UITableView上的情况,但是这么做,你就需要在代理方法中进行判断,无疑增加了成本。
综上所述,我一般都是继承自UIViewController
,并在里面实例化UITableView
,并不会多增加多少代码,但是可以避免很多问题,比如加载子视图放在UIViewController根view上就不会有跟随滚动的问题,加载断网图,也不会出现盖不全的问题。
UITableView子视图跟随滚动问题的解决
下面我们就直接看一下代码。
1. JJTableActivityVC.h
#import <UIKit/UIKit.h>
@interface JJTableActivityVC : UITableViewController
@end
2. JJTableActivityVC.m
#import "JJTableActivityVC.h"
@interface JJTableActivityVC ()
@property (nonatomic, strong) UIView *activityView;
@end
@implementation JJTableActivityVC
- (void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];
[self initUI];
}
#pragma mark - Object Private Function
- (void)initUI
{
self.activityView = [[UIView alloc] initWithFrame:CGRectMake(self.view.bounds.size.width - 130.0, self.view.bounds.size.height - 130.0, 100.0, 100.0)];
self.activityView.backgroundColor = [UIColor redColor];
[self.view addSubview:self.activityView];
}
#pragma mark - UITableViewDataSource && UITableViewDelegate
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 100;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"];
return cell;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
NSLog(@"滚动范围 : x = %lf, y = %lf", scrollView.contentOffset.x, scrollView.contentOffset.y);
//更新视图的y值,让其看似不动在右下角
self.activityView.frame = CGRectMake(self.view.bounds.size.width - 130.0, self.view.bounds.size.height - 130.0 + scrollView.contentOffset.y, 100.0, 100.0);
NSLog(@"tableviewFrame = %@", self.tableView);
NSLog(@"activityViewFrame = %@", self.activityView);
}
@end
看部分输出结果
2017-12-31 16:01:53.314784+0800 JJTableView[2857:116083] 滚动范围 : x = 0.000000, y = 633.000000
2017-12-31 16:01:53.315163+0800 JJTableView[2857:116083] tableviewFrame = <UITableView: 0x7fad5581bc00; frame = (0 0; 375 667); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x600000243990>; layer = <CALayer: 0x6000000331e0>; contentOffset: {0, 633}; contentSize: {375, 4429}; adjustedContentInset: {20, 0, 0, 0}>
2017-12-31 16:01:53.315570+0800 JJTableView[2857:116083] activityViewFrame = <UIView: 0x7fad53f0a350; frame = (245 1170; 100 100); layer = <CALayer: 0x604000220020>>
2017-12-31 16:01:53.331156+0800 JJTableView[2857:116083] 滚动范围 : x = 0.000000, y = 648.000000
2017-12-31 16:01:53.331559+0800 JJTableView[2857:116083] tableviewFrame = <UITableView: 0x7fad5581bc00; frame = (0 0; 375 667); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x600000243990>; layer = <CALayer: 0x6000000331e0>; contentOffset: {0, 648}; contentSize: {375, 4429}; adjustedContentInset: {20, 0, 0, 0}>
2017-12-31 16:01:53.331821+0800 JJTableView[2857:116083] activityViewFrame = <UIView: 0x7fad53f0a350; frame = (245 1185; 100 100); layer = <CALayer: 0x604000220020>>
2017-12-31 16:01:53.348096+0800 JJTableView[2857:116083] 滚动范围 : x = 0.000000, y = 662.500000
2017-12-31 16:01:53.348449+0800 JJTableView[2857:116083] tableviewFrame = <UITableView: 0x7fad5581bc00; frame = (0 0; 375 667); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x600000243990>; layer = <CALayer: 0x6000000331e0>; contentOffset: {0, 662.5}; contentSize: {375, 4430}; adjustedContentInset: {20, 0, 0, 0}>
2017-12-31 16:01:53.348806+0800 JJTableView[2857:116083] activityViewFrame = <UIView: 0x7fad53f0a350; frame = (245 1199.5; 100 100); layer = <CALayer: 0x604000220020>>
2017-12-31 16:01:53.364676+0800 JJTableView[2857:116083] 滚动范围 : x = 0.000000, y = 676.500000
2017-12-31 16:01:53.365079+0800 JJTableView[2857:116083] tableviewFrame = <UITableView: 0x7fad5581bc00; frame = (0 0; 375 667); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x600000243990>; layer = <CALayer: 0x6000000331e0>; contentOffset: {0, 676.5}; contentSize: {375, 4430}; adjustedContentInset: {20, 0, 0, 0}>
2017-12-31 16:01:53.365379+0800 JJTableView[2857:116083] activityViewFrame = <UIView: 0x7fad53f0a350; frame = (245 1213.5; 100 100); layer = <CALayer: 0x604000220020>>
2017-12-31 16:01:53.381149+0800 JJTableView[2857:116083] 滚动范围 : x = 0.000000, y = 690.000000
2017-12-31 16:01:53.381790+0800 JJTableView[2857:116083] tableviewFrame = <UITableView: 0x7fad5581bc00; frame = (0 0; 375 667); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x600000243990>; layer = <CALayer: 0x6000000331e0>; contentOffset: {0, 690}; contentSize: {375, 4430}; adjustedContentInset: {20, 0, 0, 0}>
2017-12-31 16:01:53.382252+0800 JJTableView[2857:116083] activityViewFrame = <UIView: 0x7fad53f0a350; frame = (245 1227; 100 100); layer = <CALayer: 0x604000220020>>
看一下效果图
这样子控件就不跟着跑了,虽然这个可以解决,但是还是觉得不方便,尽量用UIViewController
吧。
后记
未完,待续~~~