美文网首页
详解iOS开发中UITableview cell 顶部空白的多种

详解iOS开发中UITableview cell 顶部空白的多种

作者: 淇水朱华 | 来源:发表于2017-05-13 15:30 被阅读635次

    本篇文章来源于网络,我想找到出处,但是转的太多,也不知道原创者在哪里有写。因为网络上的排版,等问题,我重新转载此处。非原创,碰到了所以在这里记下。多传作者heiline,来自豆豆网。

    前言

    这篇文章主要介绍了详解iOS开发中UITableview cell 顶部空白的多种设置方法的相关资料,大多没人会主动设置这个,但是有很大几率会遇到过这个问题,下面总结下可能是哪些情况:

    1, self.automaticallyAdjustsScrollViewInsets = NO;

    这个应该是最常见而且不容易被发现的原因,起因是iOS7在Conttoller中新增了automaticallyAdjustsScrollViewInsets这个属性,当设置为YES时(默认YES),如果视图里面存在唯一一个UIScrollView或其子类View,那么它会自动设置相应的内边距,这样可以让scroll占据整个视图,又不会让导航栏遮盖。
      PS:iOS7里面的布局问题挺多的,使用autolayout的时候会遇到好多,大概是因为iOS7新加入autolayout还还不成熟导致的吧。

    2,navigationbar设置问题

    虽然表面上看是tableview顶部有空白,但实际上可能是因为navigationbar设置问题导致。
       self.navigationController.navigationBar.translucent = NO; 这个属性设为no之后,tableview会在上方留出64.f的位置给navigationbar,也有小概率导致这个问题。

    3,tableview section header高度设置问题

    这个应该是新手遇到的比较多的。起因是iOS奇葩的逻辑,如果你设置header(或者footer)高度是0的话,系统会认为你没设置,然后将其设置为40.f。所以需要将其设置为一个较小的数:

    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return 0.001f;
    }
    
    4,tableview的header、footer设置问题

    和3很像是不是?没发现区别吗?那就再读一次看看。这次是tableview的header视图引起的,而不是section的header高度引起。
      对于tableview,不仅每个section有header,tableview整体也有header和footer,API如下:

    @property (nonatomic, strong, nullable) UIView *tableHeaderView; // accessory view for above row content. default is nil. not to be confused with section header
    @property (nonatomic, strong, nullable) UIView *tableFooterView; // accessory view below content. default is nil. not to be confused with section footer
    

    这个header和footer要比section的header要和谐一些,只要你不去主动碰它就没事,但是如果你碰了...哼,哼...基本上会被设置出40.f高的间距。出现如下任意一行代码均会引起这个问题:

    self.tableView.tableHeaderView = nil; 
     self.tableView.tableHeaderView = [[UIView alloc] init]; 
     self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectZero]; 
     self.tableView.tableFooterView = nil; 
     self.tableView.tableFooterView = [[UIView alloc] init]; 
     self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
    

    对,你没想错,footerView也不能设置,footer和header只要设置了任意一个都会使两个地方都出现空白。不要问我为什么...
      当然,如果有的时候真的只需要其中一个view的话该怎么办呢?请如下设置:(似不似傻,自己建一个view呗,非得用着恶心的东西么...)

    self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenSize.width, 0.0001f)];
    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenSize.width, 0.0001f)];
    

    说白了,还是得设置成一个很小的高度,而不是0才行。
      关于tableView顶部空白的总结基本就这些了,如果想屏蔽的话,建议把这些写在baseTableViewController里面,这样就不用每次都扣这些东西了。宏懒得粘了,都是常见的,大家应该都能看懂。navigationbar那个,因为这个东西一般不在这里设置,写在base里面不是一个好的做法。

    //
    // HLNBaseTableViewController.m
    // HLN-IMDemo
    //
    // Created by heiline on 15/8/25.
    // Copyright (c) 2015年 baidu. All rights reserved.
    //
    #import "HLNBaseTableViewController.h"
    @interface HLNBaseTableViewController () 
    @end
    @implementation HLNBaseTableViewController
    - (void)viewDidLoad {
    [super viewDidLoad];
    self.tableView = [[UITableView alloc] initWithFrame:(CGRect){CGPointZero, kScreenSize} style:_tableViewStyle];
    [self.view addSubview:self.tableView];
    self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenSize.width, 0.0001f)];
    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenSize.width, 0.0001f)];
    if (self.navigationController != nil) {
    self.tableView.height -= kNavBarH + kStatusBarH;
    }
    if (self.tabBarController != nil) {
    if (self.navigationController.childViewControllers.count == 1) {
    self.tableView.height -= kTabBarH;
    }
    }
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    self.automaticallyAdjustsScrollViewInsets = NO;
    }
    - (void)dealloc {
    self.tableView.dataSource = nil;
    self.tableView.delegate = nil;
    }
    #pragma mark Table View Data Source And delegate Methods
    -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 0;
    }
    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 0;
    }
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    return [[UITableViewCell alloc] init];
    }
    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    }
    - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    return nil;
    }
    - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    return nil;
    }
    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return 0.001f;
    }
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 40.f;
    }
    -(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return 0.001f;
    }
    @end
    

    相关文章

      网友评论

          本文标题:详解iOS开发中UITableview cell 顶部空白的多种

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