如何以模式方式打开 UIVIewController 视图的实际大小?

How can I get the actual size of a UIVIewController view open modally?

提问人:Mig70 提问时间:12/31/2021 最后编辑:Mig70 更新时间:12/31/2021 访问量:675

问:

我正在以模式打开视图控制器,在以模式方式打开的 UIViewController 的 ViewDidLoad 上,我需要知道它的宽度和高度。 当我在 iPad 12.9 英寸上测试时,这成为一个问题。以模式打开的 UIViewControllers 不会占用整个屏幕的高度或宽度,如果没问题,但我需要知道这个视图的大小。

这是我以模式打开UIViewController的方式:

viewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:viewController animated:YES completion:NULL];

重要提示:我需要知道 ViewDidLoad 上 UIViewController 视图的大小。但是,此时使用 self.view.frame 或 self.view.bounds 将获得全屏的大小,这实际上不是视图打开时 UIViewController 视图的大小。

附加信息:我正在 iOS15 上执行此测试。

iOS Objective-C UIVieviceController 大小

评论


答:

3赞 Andrei Giuglea 12/31/2021 #1

您可以在 viewDidLayoutSubviews 方法中找到 ViewController 的实际高度,任何其他 UI 更新都应在此处完成。

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
 // Actual height
    NSLog(@"%f",self.view.frame.size.height);
}

评论

0赞 Mig70 12/31/2021
谢谢。但是,这并不能解决我的问题,因为我需要在 viewDidLoad 上访问此模式 UIVIewController 视图的大小。此时访问 self.view.frame 或 self.view.bounds 具有全屏的宽度和高度。我将用这个额外的请求来更新我的问题。
0赞 Andrei Giuglea 12/31/2021
请问为什么您只在viewDidLoad上需要它?除非设置一些固定约束和/或计算它,否则无法真正获取 viewDidLoad 中的高度,因为约束尚未应用。
0赞 Mig70 1/1/2022
我在 ViewDidLoad 上填充我的 UIViewController 视图,因为它在一开始就运行一次。直到现在,这似乎是正确的事件。遗憾的是,以模式打开 UIViewController 时,ViewDidLoad 上的 view.frame / view.bounds 不正确。我现在所做的是在 ViewWillAppear 上填充 UIViewController 视图,但仅在它第一次运行时运行,这恰好在 viewDidLayedSubViews 之前运行,后者运行多次。
0赞 Andrei Giuglea 1/2/2022
您可以引入一个值来确保您的函数只运行一次,如下所示: - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; if (self.shouldLoad) { [self yourFunction]; self.shouldLoad = false;
0赞 Mig70 1/2/2022
是的,这就是我最终所做的。谢谢安德烈!