- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 UITabBarController 内有一个非常基本的 UINavigationController 设置。我想以编程方式布局该导航 Controller 的 rootViewController 的 View ,但是当我查看 viewDidLoad 内的 self.view.frame 时,我得到了这个(例如,在横向中):
1. view frame: {{20, 0}, {748, 1024}} // looks like an odd portrait mode
然后我自动旋转到纵向,我得到了这个:
2. view frame: {{0, 0}, {768, 911}}
然后当我回到横向时,框架现在是这样的:
3. view frame: {{0, 0}, {1024, 655}}
进一步的自旋转事件将在帧值 #2 和 #3 之间翻转。
为了解决 #1 的怪异问题,我目前正在 viewDidLoad 中执行此操作:
if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) {
self.view.frame = CGRectMake(0, 0, 768, 911);
} else {
self.view.frame = CGRectMake(0, 0, 1024, 655);
}
我觉得我显然错过了一些东西。当 View 自动旋转回相同方向时,为什么 View 的默认框架与框架不匹配? View 框架是否未设置为初始方向?很困惑...
我应该提到的是,上述内容(包括我的拙劣的黑客行为)都没有在视觉上改变任何东西。我进行黑客攻击的原因是,当我将 subview 布局到此 View 中时,它们将基于我期望的位置,即导航栏下方的左上角。
我做错了什么?
更新:关闭 View 上的所有自动调整大小的内容会将结果 #1 更改为:
view frame: {{0, 0}, {748, 1024}}
这看起来有点接近,但仍然不匹配#3。
最佳答案
不保证 viewDidLoad 中的框架与最终显示 View 时的框架相同。 UIKit 在显示 View Controller View 之前根据将要出现的上下文来调整它的框架。大小是根据界面方向和任何可见导航栏、选项卡栏、工具栏或状态栏的尺寸(其本身的高度可以更改,例如当您正在打电话时)确定的。
它有助于理解加载和显示 View Controller 的 View 时会发生什么:
某些东西第一次访问 View Controller 的 view
属性。这可能发生在您自己的代码中,或者发生在 UIKit 中以响应用户操作(例如选择选项卡)。
UIKit 通过调用 loadView
(如果已定义)来延迟加载 View Controller 的 View ,或者通过从 initWithNibName:bundle:
中指定的 NIB 加载 View >。如果两者都不存在,UIKit 只会加载一个空 View 。
一旦 View 及其 subview 完全加载,UIKit 就会调用 viewDidLoad
。 此时, View 的框架将是 NIB 或 loadView
中设置的内容。
有东西调用 UIKit 来显示 View Controller 的 View 。同样,这可能是用户操作,例如点击选项卡,也可能是代码中的显式方法调用,例如 pushViewController:animated:
或 presentModalViewController:animated:
。
UIKit 根据 View 呈现的上下文调整 View 大小,如上所述。
UIKit 调用 viewWillAppear:
。 框架现在应该是要显示的尺寸。 (?)编辑:这可能不再正确。请参阅下面的评论。
UIKit 显示带有或不带有动画的 View 。
UIKit 调用 viewDidAppear:
。
正如您所看到的,如果您需要在呈现 View 框架之前知道 View 框架的大小,viewWillAppear:
是您唯一的机会。请记住,在 View 出现后,此尺寸可能会因各种原因而发生变化,包括旋转事件或状态栏高度的变化。因此,为每个 subview 提供适当的 autoresizingMask 非常重要,以确保布局可以根据边界的任何变化正确调整自身。
如果您希望手动构建 View 层次结构,建议在 loadView 中执行此操作。由于您自己在此方法中构造 View ,因此您可以将其框架初始化为您想要的任何内容。您选择的大小并不重要,因为 UIKit 可能会根据您的情况更改它。只需确保正确设置 autoresizingMasks 即可。
关于iphone - 为什么我必须在 viewDidLoad 中手动设置 View 的框架?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6757018/
我正在学习 objective-c 教程,并注意到 viewDidLoad 中的代码放在 super viewDidLoad 下,而不是第一次调用 viewDidLoad。 代码放在viewDidLo
在Apple的scrollView示例中,他们没有这样称呼。我一直认为这是必须的。我为什么要这样调用它? 最佳答案 如果您要重写该方法,您仍然应该在 super 中调用该方法。即使父类(super c
这个问题已经有答案了: Why/when do we have to call super.ViewDidLoad? (6 个回答) 已关闭 4 年前。 override func viewDidLo
大家好,我有一个双 View Controller 。 我的 firstviewcontroller 有一个按钮,这个按钮发送 NSNotification,secontviewController
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Do I always have to call [super viewDidLoad] in the -v
我有一个关于子类化的问题。 我从我的第一个 View 开始:在我的 .h 文件中: @interface viewAController : UIViewController 在我的 .m 文件中:
我读到一篇文章说,当创建 UIViewController 类时,属性需要为零,然后 Storyboard 或在调用 viewDidLoad 时将其添加到值中。 它表示在构造对象时也无法初始化属性。
这是我当前的代码。我什至没有通过 viewDidLoad 方法覆盖,因为在它说 super viewdidload 的那一行它抛出错误 @interface for uitableview 为选择器
import UIKit class SecondViewController: UIViewController { @IBOutlet weak var labelA: UILabel!
我需要设置和存储一些可用于 View 的 NSUserDefaults 数据。这不适用于 viewDidLoad。 这可以做到吗? 在 viewDidLoad 之前我可以使用什么方法? 你会推荐什么?
当我向主视图 Controller 中的 viewDidLoad 添加方法时,我的 iPhone 应用程序崩溃了: #import "dbQuestionGetterViewController.h"
当用户切换到另一个程序然后再次返回时,原始程序的 View 将被另一个程序的新 View 替换。那么当用户切换回原来的程序时,viewDidLoad会被第二次调用吗? 我问这个是因为如果是这种情况,那
全部, 我正在从我的 applicationDidFinishLaunching 方法创建一个 windowController ... (void)applicationDidFinishLaunc
这个问题已经有答案了: Looking to understand the iOS UIViewController lifecycle (11 个回答) iPhone SDK: what is th
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 5年前关闭。 Improve this
我知道viewDidLoad在 UIViewController 期间可能会多次调用方法的生命周期。但这怎么可能?如何让它多次调用而不是直接调用它?我试过这样做: UIView *view = [
我在使用 iOS 时遇到了一点问题。我使用协议(protocol)在两个 View Controller 之间来回传递数据并手动切换 View 。我的问题是,当我关闭顶 View 时,不再调用底 Vi
我正在开发一款新应用程序,该应用程序主要用于组织网络内容中的信息。它将是一款用于监控道琼斯指数股息 yield 的金融应用程序。为此,需要执行几个步骤,但我现在正在执行第一步。我想选取道琼斯指数中的
我需要采用 viewDidLoad 方法中填充的变量来显示在连接到自定义单元格的标签上。我想做的是: 查找数据库中存储的用户盒子中的 SKU 使用SKU查找数据库中存储的产品详细信息 将产品详细信息存
我正在 viewDidLoad 中使用异步任务函数,根据返回的响应,我正在更改 View (颜色、文本...),但我有“错误”: 有时,当我更改 View 并返回 View 时,我的 View 背景没
我是一名优秀的程序员,十分优秀!