UIViewController viewDidLoad 宽度/高度不正确

2023-11-27

每个人都知道你不能相信 UIViewController init/viewDidLoad 方法上的帧大小;这:

- (void)viewDidLoad: {
     NSLog(@"%d", self.view.frame.size.width);
}

在很多情况下会打印错误的尺寸(特别是在横向模式下它几乎被破坏)

这实际上会返回始终正确的结果,因此最好布局子视图:

- (void)viewWillAppear: {
     NSLog(@"%d", self.view.frame.size.width);
}

问题是 viewWillAppears 每次视图出现时都会被调用,因此不适合分配或添加子视图。所以你最终声明每一个视图在界面中,您最终会得到我根本不喜欢的巨大头文件,因为大多数项目在初始设置后不需要任何更多操作。

所以问题一是:有没有更好的方法来处理子视图定位?

问题二非常相关,假设我有一个 UIView 的子类,其中包括各种其他子视图。我在界面中声明它,并在 init/viewDidLoad 方法中分配/初始化它。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    ...
    menu = [[SNKSlidingMenu alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    ...
}

正如我们已经知道的,我们现在需要在 viewWillAppear 中重新定位它以获得更准确的读数

- (void)viewWillAppear:(BOOL)animated{
    ....
    menu.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    ....
 }

问题是当然所有子视图也需要重新定位。这是通过自动调用的layoutSubviews函数来完成的,但我们遇到了同样的问题:所有子视图都需要在 SNKSlidingMenu 类的接口内声明。有没有办法解决这个问题?

Thanks.


如果您的目标是 iOS 5.0 或更高版本,您可以使用viewWillLayoutSubviews and viewDidLayoutSubviews做出改变。

至于你的第二个问题,如果你需要以其他方法访问实例变量init,你需要保留它,我不认为它有什么问题。

但是,您可以尝试使用自动布局并在子视图之间设置规则,以便自动为您布局,而无需保留引用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UIViewController viewDidLoad 宽度/高度不正确 的相关文章

随机推荐

  • 如何在 .NET 中创建子集字体?

    我有一个 Silverlight 应用程序 需要在其中嵌入一些不太常见的字体 这对我来说非常简单 只需复制 TTF OTF 并使用我的应用程序进行编译即可 然而 在很多情况下 实际只使用了 5 10 个字符 在其他情况下 某些字体文件非常大
  • 将 Hibernate 升级到 5.1.0 后如何导出架构?

    我最近将 Hibernate 从 5 0 更新到 5 1SchemaExportAPI 已更改 迁移文档提到了这一更改 但没有解释如何使用较新的 API 此外 我还没有找到任何其他支持示例来修复重大更改 我偶然发现了这个代码差异 它帮助我解
  • 删除用作外键的对象

    我有下一个型号 class Target models Model name models CharField max length 100 blank False class SubTarget models Model target m
  • MVC JSON 操作返回 bool

    我的 ASP NET MVC 操作是这样写的 GET TaxStatements CalculateTax prettyId public ActionResult CalculateTax int prettyId if prettyId
  • 检测winforms中的箭头键[重复]

    这个问题在这里已经有答案了 可能的重复 上 下 左 右方向键不触发 KeyDown 事件 先看代码 using System using System Collections Generic using System ComponentMo
  • 通过 Composer 安装 Laravel 时获取建议

    从昨天开始 当我通过以下方式创建 laravel 项目时 composer create project prefer dist laravel laravel project name 我收到这些建议消息 这是正常现象还是我搞砸了什么 我
  • 如何指定实际的 x 轴值以在 R 中绘制为 x 轴刻度

    我正在 R 中创建一个绘图 但我不喜欢 R 绘制的 x 轴值 例如 x lt seq 10 200 10 y lt runif x plot x y 这将绘制一个在 X 轴上具有以下值的图表 50 100 150 200 但是 我想绘制 2
  • MySQL - IN() 中的 ORDER BY 值

    我希望对以下查询中返回的项目进行排序它们输入 IN 函数的顺序 INPUT SELECT id name FROM mytable WHERE name IN B A D E C OUTPUT id name 5 B 6 B 1 D 15
  • 如何将流程图转化为实施? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 编辑 简介 为了吸引更广泛的读者 我通过一个复杂的 有点乏味的 现实生活中的例子重新阐述了我最初的问题 原始问题如下 远 所示 Tom 刚刚被 Acme Inc 聘为初级软件工程
  • 如何使用 c# 使用 httpwebrequest 从 json api 获取数据?

    我想从中获取所有变量https api coinmarketcap com v1 ticker 在我的 C 控制台应用程序中 我怎样才能做到这一点 我首先将整个页面作为流获取 现在做什么 private static void start
  • Swift 错误:对泛型类型 Dictionary 的引用需要 <...> 中的参数

    错误Reference to generic type Dictionary requires arguments in lt gt 出现在函数的第一行 我试图让该函数返回从 api 检索到的 NSDictionary 有人知道这里会发生什
  • Java 等待线程列表

    有没有办法获取对象上的等待线程列表 等待线程数 如果您正在使用synchronized关键字 没有 但如果您正在使用java util concurrent锁 你可以 ReentrantLock有一个受保护的方法getWaitingThre
  • React Native - 将登录的 Firebase 用户重定向到 Home 组件

    我的目标是将用户重定向到Home如果用户已经登录 则组件 我可以登录用户并将其重定向到Home除非 logInUser 叫做 然而 一旦重定向到Home组件 如果我刷新模拟器 应用程序将返回到Login成分 我尝试使用来解决这个问题comp
  • 将列表中的每个元素乘以一个数字

    我想将列表中的所有元素乘以一个数字 我知道其他方法可以做到这一点 但我想知道为什么这不起作用 我得到的列表与输出完全相同 lst eval input enter a list for num in lst num num 2 print
  • 将 JPanel 置于 java 中其他对象的前面 (SWING)

    我想在应用程序处理时发出加载消息 所以我使用了JPanel over a JTree 但是当用户点击JPanel the JTree将被选择并且JPanel会去后面 隐藏之后JPanel 它再也不会出现 我不知道为什么 但它似乎永远不会走在
  • 是否可以基于 MySQL 中的列之一进行选择插入?

    以下插入是否基于 MySQL 中可能的列之一的选择 INSERT INTO student fees id name fees VALUES 1 SELECT name from students where student id 1 20
  • 如何在 AWS ElasticBeanstalk 和 Nginx 上使用 OAuth2 的 Spring Boot 应用程序上强制使用 SSL?

    我正在尝试使用参考文档强制使用 SSL https docs spring io spring boot docs current reference html howto security html howto enable https
  • 如何实现可取消的事件?

    在 System ComponentModel 中 有一个名为 CancelEventArgs 的类 其中包含可以在事件侦听器中设置的 Cancel 成员 MSDN 上的文档解释了如何使用它来取消侦听器内的事件 但如何使用它来实现我自己的可
  • 如何在 Windows 应用程序中启用常用控件

    我正在尝试在应用程序中启用通用控件 我按照中给出的步骤进行操作这篇 MSDN 文章 特别是该部分在仅使用标准扩展的应用程序中使用 ComCtl32 dll 版本 6 但我无法让它发挥作用 我做的唯一与本文不同的事情是我将清单信息添加到项目属
  • UIViewController viewDidLoad 宽度/高度不正确

    每个人都知道你不能相信 UIViewController init viewDidLoad 方法上的帧大小 这 void viewDidLoad NSLog d self view frame size width 在很多情况下会打印错误的