iOS 6.0 Masonry自动布局表头/表尾时崩溃解决方案

iOS 6.0 Masonry自动布局表头/表尾时崩溃解决方案



使用Masonry要兼容iOS6.0,正常情况下都是可以的。但是对于UITableViewtableHeaderView或者tableFooterView不能直接添加约束,否则在iOS6.0上必闪退。

提示:若您的App不需要支持到iOS6.0,那么您没必要继续阅读这篇文章

支持原创,请阅读原文

解决方案


- (void)configTableView {
  if (self.tableView != nil) {
    return;
  }
  self.tableView = [[UITableView alloc] init];
  [self.view addSubview:self.tableView];
  [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
    make.edges.mas_equalTo(self.view);
  }];

  NSArray *array = [self headerViewWithHeight:self.view.frame.size.height addToView:self.view];
    UIView *headerView = [array firstObject];
  [headerView layoutIfNeeded];
  UIButton *button = [array lastObject];
  CGFloat h = button.frame.size.height + button.frame.origin.y + 40;
  h = h < self.view.frame.size.height ? self.view.frame.size.height : h;

  [headerView removeFromSuperview];
  [self headerViewWithHeight:h addToView:nil];
}

- (NSArray *)headerViewWithHeight:(CGFloat)height addToView:(UIView *)toView {
  // 注意,绝对不能给tableheaderview直接添加约束,必闪退
  UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, height)];

  if (toView) {
    [toView addSubview:headerView];
  } else {
    self.tableView.tableHeaderView = headerView;
  }

  UIImageView *imgView = [[UIImageView alloc] init];
  [headerView addSubview:imgView];
  imgView.backgroundColor = [UIColor greenColor];
  imgView.layer.cornerRadius = 50;
  imgView.layer.masksToBounds = YES;
  imgView.layer.borderWidth = 0.5;
  imgView.layer.borderColor = [UIColor redColor].CGColor;

  CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width;

  UILabel *tipLabel = [[UILabel alloc] init];
  tipLabel.text = @"这里是提示信息,通常会比较长,可能会超过两行。为了适配6.0,我们需要指定preferredMaxLayoutWidth,但是要注意,此属性一旦设置,不是只在6.0上生效,任意版本的系统的都有作用,因此此值设置得一定要准备,否则计算结果会不正确。我们一定要注意,不能给tableview的tableHeaderView和tableFooterView添加约束,在6.0及其以下版本上会crash,其它版本没有";
  tipLabel.textAlignment = NSTextAlignmentCenter;
  tipLabel.textColor = [UIColor blackColor];
  tipLabel.backgroundColor = [UIColor clearColor];
  tipLabel.numberOfLines = 0;
  tipLabel.preferredMaxLayoutWidth = screenWidth - 30;
  [headerView addSubview:tipLabel];

  UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
  [button setTitle:@"Show detail" forState:UIControlStateNormal];
  [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
  [button setBackgroundColor:[UIColor blueColor]];
  button.layer.cornerRadius = 6;
  button.clipsToBounds = YES;
  button.layer.masksToBounds = YES;

  [headerView addSubview:button];

  [imgView mas_makeConstraints:^(MASConstraintMaker *make) {
    make.top.mas_equalTo(80);
    make.centerX.mas_equalTo(headerView);
    make.width.height.mas_equalTo(100);
  }];

  [tipLabel mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.mas_equalTo(self.view).offset(15);
    make.right.mas_equalTo(self.view).offset(-15);
    make.top.mas_equalTo(imgView.mas_bottom).offset(40);
  }];

  [button mas_makeConstraints:^(MASConstraintMaker *make) {
    make.top.mas_greaterThanOrEqualTo(tipLabel.mas_bottom).offset(80);
    make.left.mas_equalTo(tipLabel);
    make.right.mas_equalTo(tipLabel);
    make.height.mas_equalTo(45);
  }];

  return @[headerView, button];
}

关键解决方法是在这里:

NSArray *array = [self headerViewWithHeight:self.view.frame.size.height addToView:self.view];
UIView *headerView = [array firstObject];
[headerView layoutIfNeeded];
UIButton *button = [array lastObject];
CGFloat h = button.frame.size.height + button.frame.origin.y + 40;
h = h < self.view.frame.size.height ? self.view.frame.size.height : h;

[headerView removeFromSuperview];
[self headerViewWithHeight:h addToView:nil];

这里就是调用了两个创建headerView,其中第一次创建的目的是获取总高,如果提前就已经知道总高,那么就不需要调用两次了。但是,如果是动态的,我们事先不确定其总高,那么我们还是使用自动布局来计算总高。

第一次调用时,将headerView放在self.view上,得到总高后,再移除掉。

第二次调用的时候,就是直接写self.tableView.tableHeaderView = headerView就可以了。

关注我



微信公众号:iOSDevShares
有问必答QQ群:324400294

时间: 2025-01-21 13:38:04

iOS 6.0 Masonry自动布局表头/表尾时崩溃解决方案的相关文章

Excel中表头表尾固定打印

在平时的工作中,用  Excel编制表格确实给我们带来了很大的方便,但当一个工作表数据较多时,如有上百人的单位工资表,打印时由于纸张大小有限制,不可能在一页上打印完,这就要求进行多页打印,如果每一页都去制作表头,即便使用复制的方法也是很繁琐的,同时当需要插入或减少人员时,还需手工调整每一页的表头,下面我以  Excel2000为例,介绍一种简单固定表头和表侧的方法.首先,需要告诉大家的是,在Excel表中,表头被称之为标题行,表侧被称之为标题列.下面我们开始操作,打开一个需要固定标题行或标题列的

(200分跪求)怎样定义datagridview表尾?

问题描述 怎样定义datagridview表尾?我想在datagridview表尾增加合计行. 解决方案 解决方案二:自定义表尾可以试试FooterTemplate自定义模版解决方案三:看微软教程,很简单解决方案四:是在winform的情况下啊,我忘了说.解决方案五:什么情况上应该都行的啊.解决方案六:表尾问题其实有很多解决方案.你可以操作DataTable,在datatable里面计算合总,你也可以在datagridview控件下面加lable控件来显示计算合总,至于排版问题就自己解决.解决方

怎么在Excel中实现固定打印表头与表尾

故障现象: 如何在 Excel 中实现固定打印表头与表尾. 解决方案: Excel 为我们设置了打印顶端标题行的功能,如下图:     2003版:文件>页面设置>工作表 2007和2010版:页面布局>页面设置>打印标题                             完成

Excel如何打印固定表头和表尾

Excel 为我们设置了打印顶端标题行的功能,如下图: 2003版:文件>页 面设置>工作表 2007和2010版:页面布局>页面设置>打印标题 但是 Excel 却没有给我们设置固定打印 表尾这一功能,非用不可时只能把表尾转成图片,作为页脚插入,然后可怜兮兮地一个人坐在电脑前一毫米一毫米地调整图片的 大小,直到看上去像那么回事为止.更可怜的是,如果我们需要的固定表尾里是一个动态的汇总值,那就--哭吧-- 其实也没到要哭的那一步,分类汇总功能可以帮助我们实现每一页最后自动生成一个动

Masonry自动布局详解二:动画更新约束

Masonry自动布局详解二:动画更新约束 说到iOS自动布局,有很多的解决办法.有的人使用xib/storyboard自动布局,也有人使用frame来适配.对于前者,笔者并不喜欢,也不支持.对于后者,更是麻烦,到处计算高度.宽度等,千万大量代码的冗余,对维护和开发的效率都很低. 笔者在这里介绍纯代码自动布局的第三方库:Masonry.这个库使用率相当高,在全世界都有大量的开发者在使用,其star数量也是相当高的. 支持原创,请阅读原文 效果图 本节详解Masonry的以动画的形式更新约束的基本

Masonry自动布局详解六:tableviewCell布局

Masonry自动布局详解六:tableviewCell布局 说到iOS自动布局,有很多的解决办法.有的人使用xib/storyboard自动布局,也有人使用frame来适配.对于前者,笔者并不喜欢,也不支持.对于后者,更是麻烦,到处计算高度.宽度等,千万大量代码的冗余,对维护和开发的效率都很低. 笔者在这里介绍纯代码自动布局的第三方库:Masonry.这个库使用率相当高,在全世界都有大量的开发者在使用,其star数量也是相当高的. 支持原创,请阅读原文 效果图 本节详解Masonry的以动画的

Masonry自动布局详解七:ScrollView循环布局

Masonry自动布局详解七:ScrollView循环布局 说到iOS自动布局,有很多的解决办法.有的人使用xib/storyboard自动布局,也有人使用frame来适配.对于前者,笔者并不喜欢,也不支持.对于后者,更是麻烦,到处计算高度.宽度等,千万大量代码的冗余,对维护和开发的效率都很低. 笔者在这里介绍纯代码自动布局的第三方库:Masonry.这个库使用率相当高,在全世界都有大量的开发者在使用,其star数量也是相当高的. 支持原创,请阅读原文 效果图 本节详解Masonry的循环创建视

Masonry自动布局详解九:scrollview实战场景

Masonry自动布局详解九:scrollview实战场景 说到iOS自动布局,有很多的解决办法.有的人使用xib/storyboard自动布局,也有人使用frame来适配.对于前者,笔者并不喜欢,也不支持.对于后者,更是麻烦,到处计算高度.宽度等,千万大量代码的冗余,对维护和开发的效率都很低. 笔者在这里介绍纯代码自动布局的第三方库:Masonry.这个库使用率相当高,在全世界都有大量的开发者在使用,其star数量也是相当高的. 支持原创,请阅读原文 提示 在ios 6.0上不能给tablev

Masonry自动布局详解三:remake约束

Masonry自动布局详解三:remake约束 说到iOS自动布局,有很多的解决办法.有的人使用xib/storyboard自动布局,也有人使用frame来适配.对于前者,笔者并不喜欢,也不支持.对于后者,更是麻烦,到处计算高度.宽度等,千万大量代码的冗余,对维护和开发的效率都很低. 笔者在这里介绍纯代码自动布局的第三方库:Masonry.这个库使用率相当高,在全世界都有大量的开发者在使用,其star数量也是相当高的. 支持原创,请阅读原文 效果图 本节详解Masonry的以动画的形式更新约束的