问题描述

在主控制器上添加一个子控制器,发现子控制器上的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显示问题相关推荐

  1. android 不能在子线程中更新ui的讨论和分析

    问题描述 做过android开发基本都遇见过 ViewRootImpl$CalledFromWrongThreadException,上网一查,得到结果基本都是只能在主线程中更改 ui,子线程要修改 ...

  2. 为什么不能在子线程中更新UI

    首先声明一点:子线程里面是可以更新UI的--创建一个空白的Activity,在其xml文件中放一个空白TextView,Java代码如下: @Override protected void onCre ...

  3. Android利用Looper在子线程中改变UI

    MainActivity如下: package cn.testlooper; import android.app.Activity; import android.os.Bundle; import ...

  4. C#子线程中更新ui

    本文实例总结了C#子线程更新UI控件的方法,对于桌面应用程序设计的UI界面控制来说非常有实用价值.分享给大家供大家参考之用.具体分析如下: 一般在winform C/S程序中经常会在子线程中更新控件的 ...

  5. angular.js使用路由时,子控制器监听不到父级$boardcast的事件

    2019独角兽企业重金招聘Python工程师标准>>> 环境:angular.js+sastruts+apache-tomcat angular.js中当使用路由时,控制器之间通信使 ...

  6. Android子线程中更新UI的4种方法

    方法一:用Handler 1.主线程中定义Handler: Handler mHandler = new Handler() { @Override public void handleMessage ...

  7. Datatables表格数据初始化时回调函数中修改要显示的值

    场景 Datables初始化表数据后,返回的status状态值为1,2,3 现在要根据返回值的状态显示相应的中文. 实现 { data: 'status',render: function (data ...

  8. 子线程中更新UI线程的三个方法

    1.通过handler方式,sendmessage. 多个类间传递比较麻烦,也懒的写... 2.线程中通过runOnUiThread() new Thread() { public void run( ...

  9. android-如何在子线程中更新ui

    参考:https://blog.csdn.net/u013356254/article/details/52287794 实现基本跟链接相同,不同只出在于WindowManager.LayoutPar ...

最新文章

  1. 2019年中国人工智能产业研究报告
  2. 猫眼、淘票票两虎相争:下沉市场、服务、内容成决胜关键
  3. 原理分析之四:一次SQL查询的源码分析
  4. php url怎么加前缀,php – 在Laravel 5中为现有URL添加前缀
  5. oracle-关于时间的sql
  6. Oracle 本地验证和密码文件
  7. Linux下安装Redis(三分钟搞定)
  8. Paramiko模块(堡垒机)
  9. Linux 抓包还不会?这篇文章赶紧收藏
  10. 通信技术属于计算机相关专业吗,通信技术属于计算机类专业吗
  11. Unity3D开发之GL画线
  12. 北上广深不相信电单车 共享单车终究走向“死“胡同?
  13. 工业相机与工业镜头相关参数详解
  14. Linux系统开机显示BusyBox v1.22.1 built-in shell(ash) 解决方法
  15. PHP拆分粘连的英文单词,英语单词拆分技巧
  16. 2019年工作总结——没有岁月可回首,珍惜当下不负流年
  17. python制作辅助和易语言的区别_为什么多数外挂都用易语言?
  18. 安装软件时,“Windows Installer Coordinator”一直循环
  19. 关于热是什么与人体怎么感受到热的笔记
  20. HTML/CSS 变形(盒子水平垂直居中)、过渡、动画 (学习整理)

热门文章

  1. FPGA:硬件描述语言简介
  2. 深度学习——神经网络之DNN全连接神经网络、BP算法原理
  3. 各种资源的下载地址(持续更新)
  4. BCB2009编译一项目出错ILink32Error,不能打开一个乱码文件名
  5. JUC 2020 周阳 尚硅谷 学习笔记
  6. idea配置tomcat详细步骤
  7. Android 图片着色 Tint 详解2—xml设置、selector
  8. 解决:U盘制作成启动盘后容量变小
  9. Effective Java 2.0_中英文对照_Item 8
  10. 小程序分销有何区别?