设置tableViewContentSize为自身高度时,布局出错的解决办法
来源:互联网 发布:网页php的编程代码大全 编辑:程序博客网 时间:2024/06/05 04:49
项目中需求,tableView 需要被 add到一个scrollView上。tableView的内容完全平铺出来,即设置tableView的height等于tableView.ContentSize.height。 当数据刷新的时候,table的frame也需要动态改变,这时候有可能出现ui上的问题。
原因:当你reloadData后,contentsize有可能没有及时改变。这时候你设置的话就有可能出错。
方法1: 当tableView重新布局完成后,再设置frame。你可以在下一个runloop里设置frame。
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 *NSEC_PER_SEC)),dispatch_get_main_queue(), ^{
CGFloat calendarMinHeight =self.s_CalendarView.m_MinHeight;
CGSize remindTableViewContentSize =self.s_remindTableView.contentSize;
CGFloat bottomPadding = [UIScreenmainScreen].bounds.size.height - 64 - calendarMinHeight - remindTableViewContentSize.height;
bottomPadding = bottomPadding>=0 ? bottomPadding :0;
// 根据tableview内容高度修改其frame高度约束
self.s_RemindTableViewHeightConstraint.equalTo(@(remindTableViewContentSize.height));
self.s_BottomPaddingViewHeightConstraint.equalTo(@(bottomPadding));
[self.s_BackdropScrollViewupdateConstraintsIfNeeded];
[self.s_BackdropScrollViewlayoutIfNeeded];
});
这种方法的缺陷是,当数据多的时候,经测试,延时时间需要设置大一点,才能布局成功。
(tableVIew计算contentSize,你需要等他布局完成)。
方法2: 自己手动计算contentSize。即你拿到新的数据,需要reloadDate时。你自己根据数据计算高度并赋值。然后reloadData。这样不用等到下一个runloop。效果较好。
NSInteger modelNum =0;
for (int i =0; i <modelArray.count; i++)
{
modelNum += [modelArray[i]count];
}
CGRect frame =ScheduleTable.frame;
frame.size.height = workListAry.count * HistoryCellHeight;
// 根据tableview内容高度修改其frame高度约束
self.s_RemindTableViewHeightConstraint.equalTo(@(frame.size.height));
self.s_BottomPaddingViewHeightConstraint.equalTo(@(bottomPadding));
[self.s_BackdropScrollViewupdateConstraintsIfNeeded];
[self.s_BackdropScrollViewlayoutIfNeeded];
[ScheduleTablereloadData];
题外:另外一个场景很类似。我需要在界面显示的时候,将scrollVIew指定的contentoffSet展示出来。 我在ViewDidLoad里设置scrollView.contentoffSet = (0,200),没有效果。写在ViewDidAppear里有效果。因为ViewDidLoad 和VIewWillAppear在一个runloop里,这时还没有布局完成。而ViewDidAppear已经布局完成了。但是别的问题又来了,如果你写在ViewDidAppera里,你会看到界面闪一下。 我的临时做法是
在ViewDidload里,
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 *NSEC_PER_SEC)),dispatch_get_main_queue(), ^{
CGFloat topInset =TimeScroll.contentInset.top;
CGFloat beginOffsetY = -topInset;
CGFloat calendarViewHiddenHeight = [self.s_CalendarViewintrinsicContentSize].height-self.s_CalendarView.m_MinHeight;
CGFloat endOffsetY = beginOffsetY + calendarViewHiddenHeight;
[self.s_BackdropScrollViewsetContentOffset:CGPointMake(0, endOffsetY) animated:NO];
});
- 设置tableViewContentSize为自身高度时,布局出错的解决办法
- 设置ScrollView 里面的布局高度为match_parent不起作用
- 设置div的高度为屏幕高度
- div布局-子容器设置浮动对于父容器高度自适应产生影响的解决办法
- ImageView的布局及高度设置
- div里面的内容超出自身高度时,显示省略号
- div里面的内容超出自身高度时,显示省略号
- 设置iframe的高度为嵌入网页内容的高度
- 解决:有时listview设置为wrap内容时,listview高度只显示一条item的高度
- 设置viewPager的高度为自适应
- 设置viewPager的高度为自适应
- JavaScript设置body高度为浏览器高度的方法
- 当listview的item为相对布局时item高度被挤压解决
- android 手动设置 布局高度
- UITableView类型为grouped时,如何设置footer的高度为0
- UIButton 点击时无法附带自身参数的解决办法
- UIButton 点击时无法附带自身参数的解决办法
- listview条目布局中设置高度无效的问题
- Vue——父和子组件通信
- ubuntu vsftpd 503 500
- 装饰模式
- 【Cumputer】《第一次机房收费系统》总结五 选择结构运用
- 微积分下放中学已成定局,迈出历史性的一步!
- 设置tableViewContentSize为自身高度时,布局出错的解决办法
- h5、tab图片滚动原生js代码
- hadoop资源隔离
- 【Nginx-反向代理服务器】实践篇(三)之Tomcat+Nginx搭建集群
- Spark MLlib(上)--机器学习及SparkMLlib简介
- 阿里巴巴代码规范
- PD4ML Cookbook Getting Started(1)
- 合并排序问题
- Python中的for循环控制语句-常见误区