iOS中导航栏与UITableView布局冲突问题

情况描述:

我们需要实现下图效果

iOS中导航栏与UITableView布局冲突问题_第1张图片
页面一.png

分析过程

1、此页面还有其他几个页面都非常相似,考虑到这种情况,想到两种解决方法:
(1)使用UITextField等View控件解决
(2)使用UITableView,再自定义cell解决(UIViewController具有导航栏,需要在导航栏下添加一个tableView)
本文是使用第二种方法发生的Bug解决方案

self.automaticallyAdjustsScrollViewInsets = NO;解决navigation的一个自适应scrollView产生的一个高度问题

iOS中导航栏与UITableView布局冲突问题_第2张图片
图层.png

首先,要知道的是UITableView继承于UIScrollView
详情请查看以下链接
http://www.tuicool.com/articles/ymi22e
http://www.th7.cn/Program/IOS/201409/274079.shtml

代码一:UITableViewStylePlain下

#define SWIDTH [UIScreen mainScreen].bounds.size.width
@interface loginViewController ()

@property (nonatomic, strong) UITableView * tableView;

@end
- (void)viewDidLoad {
    [super viewDidLoad];

如果没有这句代码会发生下图情况:cell与TableView具有高度差
self.automaticallyAdjustsScrollViewInsets = NO;

iOS中导航栏与UITableView布局冲突问题_第3张图片
Plain下Bug情形.png
    [self  createTableView];
}
#pragma mark------自定义方法
- (void)createTableView{

    self.tableView = [[UITableView alloc]   initWithFrame:CGRectMake(0,64, SWIDTH, 200) style:UITableViewStylePlain];
    self.tableView.backgroundColor = [UIColor purpleColor];
    self.tableView.rowHeight = 50;
    self.tableView.scrollEnabled = NO;

    [self.view addSubview:self.tableView];

    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"CELL"];
}

#pragma mark------ UITableViewDataSource,UITableViewDelegate方法
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 4;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"CELL"];
    cell.textLabel.text = @"你好";
    cell.backgroundColor = [UIColor yellowColor];
    return cell;
}

代码二:UITableViewStylePlain下

#define SWIDTH [UIScreen mainScreen].bounds.size.width
@interface loginViewController ()

@property (nonatomic, strong) UITableView * tableView;

@end
- (void)viewDidLoad {
    [super viewDidLoad];

如果没有这句代码会发生下图情况:cell与TableView具有高度差
self.automaticallyAdjustsScrollViewInsets = NO;

iOS中导航栏与UITableView布局冲突问题_第4张图片
Group下BUG情形.png

iOS中导航栏与UITableView布局冲突问题_第5张图片
Group下BUG解决后.png
    [self  createTableView];
}
#pragma mark------自定义方法
- (void)createTableView{

    self.tableView = [[UITableView alloc]   initWithFrame:CGRectMake(0,64, SWIDTH, 200) style:UITableViewStylePlain];
    self.tableView.backgroundColor = [UIColor purpleColor];
    self.tableView.rowHeight = 50;
    self.tableView.scrollEnabled = NO;

    [self.view addSubview:self.tableView];

    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"CELL"];
}

#pragma mark------ UITableViewDataSource,UITableViewDelegate方法
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 2;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 2;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"CELL"];
    cell.textLabel.text = @"你好";
    cell.backgroundColor = [UIColor yellowColor];
    return cell;
}

/*
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SWIDTH, 10)];
     v.backgroundColor = [UIColor redColor];
    return v;
}
*/
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return 10;
}

Group下注意事项:

1、分区头和分区尾的高度设置不能为0,如果设为0,是没有效果的。但是我们可以设置成一个很小的数值。
2、分区头尾的设置有属性和方法两种设置方式,如果使用方法设置viewForHeaderInSection:和heightForHeaderInSection:这两个方法中的高度要保持一致。

你可能感兴趣的:(iOS中导航栏与UITableView布局冲突问题)