addChildViewController时子控制器中的UI显示问题
问题描述
在主控制器上添加一个子控制器,发现子控制器上的view元素的宽和高不是之前所给定的。
在ViewController里有一个childController,直接在- (void)viewDidLoad方法里添加,并设置了_childController.view.frame。
@interface ViewController ()@property (nonatomic, strong) ChildViewController *childController;@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib._childController = [[ChildViewController alloc] init];_childController.view.frame = CGRectMake(10, 10, 300, 300);[self addChildViewController:_childController];[self.view addSubview:_childController.view];
}
在ChildViewController里,有一个tableView
@interface ChildViewController ()@property (nonatomic, strong) UITableView *tableView;@end@implementation ChildViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.self.view.backgroundColor = [UIColor brownColor];self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];self.tableView.separatorStyle = UITableViewCellSelectionStyleNone;[self.view addSubview:self.tableView];[self.tableView setBackgroundColor:[UIColor lightGrayColor]];
}
发现tableView的宽和高并不是给定的300,打印了self.view的宽和高,也并不是300,而是屏幕的宽和高,但是现实上self.view的宽和高是300,见下图:
箭头所指是tableView,brownColor的是子控制器的view。
为什么会出现这个问题
当调用_childController.view.frame = CGRectMake(10, 10, 300, 300);的时候,触发ChildViewController的-
(void)viewDidLoad方法执行,但是这个时候_childController.view还没被添加在父视图上呢,所以坐标是被设置
了,但是还没完成设置,也就是没有最终落地到实处。所以tableView去self.view.bounds还是取得默认的试图控制
器的宽和高,默认的宽和高是屏幕的宽和高,所以导致了上述问题。
解决办法
在ChildViewController的- (void)viewDidLayoutSubviews设置tableView的frame
- (void)viewDidLayoutSubviews {[super viewDidLayoutSubviews];self.tableView.frame = self.view.bounds;
}
viewDidLayoutSubviews的执行说明子控制器已经被添加在了父控制器上了,坐标是实实在在的了,然后就正常了。
addChildViewController时子控制器中的UI显示问题相关推荐
- android 不能在子线程中更新ui的讨论和分析
问题描述 做过android开发基本都遇见过 ViewRootImpl$CalledFromWrongThreadException,上网一查,得到结果基本都是只能在主线程中更改 ui,子线程要修改 ...
- 为什么不能在子线程中更新UI
首先声明一点:子线程里面是可以更新UI的--创建一个空白的Activity,在其xml文件中放一个空白TextView,Java代码如下: @Override protected void onCre ...
- Android利用Looper在子线程中改变UI
MainActivity如下: package cn.testlooper; import android.app.Activity; import android.os.Bundle; import ...
- C#子线程中更新ui
本文实例总结了C#子线程更新UI控件的方法,对于桌面应用程序设计的UI界面控制来说非常有实用价值.分享给大家供大家参考之用.具体分析如下: 一般在winform C/S程序中经常会在子线程中更新控件的 ...
- angular.js使用路由时,子控制器监听不到父级$boardcast的事件
2019独角兽企业重金招聘Python工程师标准>>> 环境:angular.js+sastruts+apache-tomcat angular.js中当使用路由时,控制器之间通信使 ...
- Android子线程中更新UI的4种方法
方法一:用Handler 1.主线程中定义Handler: Handler mHandler = new Handler() { @Override public void handleMessage ...
- Datatables表格数据初始化时回调函数中修改要显示的值
场景 Datables初始化表数据后,返回的status状态值为1,2,3 现在要根据返回值的状态显示相应的中文. 实现 { data: 'status',render: function (data ...
- 子线程中更新UI线程的三个方法
1.通过handler方式,sendmessage. 多个类间传递比较麻烦,也懒的写... 2.线程中通过runOnUiThread() new Thread() { public void run( ...
- android-如何在子线程中更新ui
参考:https://blog.csdn.net/u013356254/article/details/52287794 实现基本跟链接相同,不同只出在于WindowManager.LayoutPar ...
最新文章
- 2019年中国人工智能产业研究报告
- 猫眼、淘票票两虎相争:下沉市场、服务、内容成决胜关键
- 原理分析之四:一次SQL查询的源码分析
- php url怎么加前缀,php – 在Laravel 5中为现有URL添加前缀
- oracle-关于时间的sql
- Oracle 本地验证和密码文件
- Linux下安装Redis(三分钟搞定)
- Paramiko模块(堡垒机)
- Linux 抓包还不会?这篇文章赶紧收藏
- 通信技术属于计算机相关专业吗,通信技术属于计算机类专业吗
- Unity3D开发之GL画线
- 北上广深不相信电单车 共享单车终究走向“死“胡同?
- 工业相机与工业镜头相关参数详解
- Linux系统开机显示BusyBox v1.22.1 built-in shell(ash) 解决方法
- PHP拆分粘连的英文单词,英语单词拆分技巧
- 2019年工作总结——没有岁月可回首,珍惜当下不负流年
- python制作辅助和易语言的区别_为什么多数外挂都用易语言?
- 安装软件时,“Windows Installer Coordinator”一直循环
- 关于热是什么与人体怎么感受到热的笔记
- HTML/CSS 变形(盒子水平垂直居中)、过渡、动画 (学习整理)