版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2017.12.31 |
前言
大家都知道UITableView這個控件是大家一定會用到的匠楚,使用的時候可以直接放在UIViewController里面實例化缎罢,也可以直接繼承UITableViewController纤掸,如果采取后者方案會少寫一些代碼,比如實例化代碼以及遵守代理和數(shù)據(jù)源代理方法,但是我還是不喜歡這么做竞穷,下面我就說一下我的原因梳庆。
使用UITableViewController的優(yōu)缺點
1. 優(yōu)點
使用UITableViewController
有很多優(yōu)點暖途,比如:
- 不用像在
UIViewController
里面那樣實例化UITableView了卑惜。 - 不用寫數(shù)據(jù)源和代理的遵守了
<UITableViewDelegate, UITableViewDataSource>
。因為系統(tǒng)已經(jīng)給加好了驻售。
NS_CLASS_AVAILABLE_IOS(2_0) @interface UITableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
2. 缺點
下面就說一下缺點露久,比如:
- 添加控件時候,由于根視圖是UITableView欺栗,所以你沒得選擇毫痕,添加子視圖,子視圖就要跟隨控件一起滾動迟几,但是絕大多數(shù)情況消请,就是除了列表以外的控件時不能滾動的。如果想讓UITableView子視圖不滾動类腮,就要監(jiān)聽
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
方法臊泰,獲取scrollView.contentOffset
更新子控件的frame,這個在下面的例子會給出蚜枢。先給出沒解決之前的示意圖缸逃。
- 在加載空視圖后者斷網(wǎng)的錯誤視圖的時候,由于根視圖是UITableView祟偷,如果你的返回section個數(shù)不為0的時候察滑,你直接加一個斷網(wǎng)視圖放在UITableView上,就會出現(xiàn)斷網(wǎng)視圖在
sectionHeader
的下面的尷尬情況修肠,一條條的sectionHeader就會把你的頁面搞亂贺辰,非常煩人。這個時候你只能依靠返回那個section個數(shù)代理方法返回為0嵌施,并且reloadData饲化,然后才可以讓sectionHeader不顯示,達到斷網(wǎng)視圖蓋到UITableView上的情況吗伤,但是這么做吃靠,你就需要在代理方法中進行判斷,無疑增加了成本足淆。
綜上所述巢块,我一般都是繼承自UIViewController
,并在里面實例化UITableView
巧号,并不會多增加多少代碼族奢,但是可以避免很多問題,比如加載子視圖放在UIViewController根view上就不會有跟隨滾動的問題丹鸿,加載斷網(wǎng)圖越走,也不會出現(xiàn)蓋不全的問題。
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
看部分輸出結(jié)果
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
吧锅纺。
后記
未完,待續(xù)~~~