美文网首页iOS bug修复程序员牛叉的demo
iOS中导航栏与UITableView布局冲突问题

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

作者: 艳晓 | 来源:发表于2016-05-20 15:02 被阅读1214次

    情况描述:

    我们需要实现下图效果

    页面一.png

    分析过程

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

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

    图层.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 ()<UITableViewDataSource,UITableViewDelegate>
    
    @property (nonatomic, strong) UITableView * tableView;
    
    @end
    - (void)viewDidLoad {
        [super viewDidLoad];
    

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

    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 ()<UITableViewDataSource,UITableViewDelegate>
    
    @property (nonatomic, strong) UITableView * tableView;
    
    @end
    - (void)viewDidLoad {
        [super viewDidLoad];
    

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

    Group下BUG情形.png
    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布局冲突问题

        本文链接:https://www.haomeiwen.com/subject/vsdnrttx.html