我在我的应用程序中发现了一个奇怪的行为,其中连接的IBOutlet在我的视图控制器中对viewWillAppear:viewDidAppear:的调用之间有其连接的视图框架.下面是我的UIViewController子类中的相关代码:

-(void)viewWillAppear:(BOOL)animated {
    NSLog(@"%@", self.scrollView);
}

-(void)viewDidAppear:(BOOL)animated {
    NSLog(@"%@", self.scrollView);
}

以及生成的日志(log)输出:

MyApp[61880:c07] <UIScrollView: 0x1057eff0; frame = (0 0; 0 0); clipsToBounds = YES; autoresize = TM+BM; gestureRecognizers = <NSArray: 0x10580100>; layer = <CALayer: 0x1057f210>; contentOffset: {0, 0}>
MyApp[61880:c07] <UIScrollView: 0x1057eff0; frame = (0 44; 320 416); clipsToBounds = YES; autoresize = TM+BM; gestureRecognizers = <NSArray: 0x10580100>; layer = <CALayer: 0x1057f210>; contentOffset: {0, 0}>

这清楚地表明帧在两次调用之间发生了变化.我想用viewDidLoad方法设置视图,但如果内容在屏幕上显示之前无法更改,那就太没用了.会发生什么?

推荐答案

Autolayout对我们设计和开发视图GUI的方式做出了巨大的改变.主要区别之一是autolayout不会立即更改视图大小,但只有在触发时才会更改,这意味着在特定时间,但我们可以强制它立即重新计算约束,或将它们标记为"需要"布局.它工作起来像-setNeedDisplay

Ios相关问答推荐

按钮在 SwiftUI 中没有采用给定的高度和宽度

如何让我的 iOS 应用程序与 api 连接?

Swift如何表示单位转换的标准大气压

如何在不同设备的segment控制中管理文本大小(text size)?

错误:在 iOS 上运行 Flutter 时找不到“Flutter/Flutter.h”文件

如何在 Apple Silicon (M1) 上运行 CocoaPods

从 Xcode 11.1 升级到 Xcode 11.2 后,应用程序因 _UITextLayoutView 而崩溃

为什么我在 iOS13.2 中加载 WKWebView 时收到控制台警告:[Process] kill() 返回意外错误 1?

Сocoapods 中继 URL 无法下载

如何删除 SwiftUI NavigationView 中的默认导航栏空间

Xcode 11 向后兼容性:“UIWindowScene 仅在 iOS 13 或更高版本中可用”

检测表在 iOS 13 上被取消

在 SwiftUI 中查找 Image(systemName:) 的所有可用图像

Xcode 10:找不到此可执行文件的有效配置文件

滑动列表项以获取更多选项(Flutter)

UIView 中的 safeAreaInsets 在 iPhone X 上为 0

CredStore 执行查询错误

在您的项目中找不到有效的 GoogleService-Info.plist

如何在 Xcode 9 中使用 iOS 11、Apple TV 4K 等进行无线调试?

UIApplication.registerForRemoteNotifications() 只能从主线程调用