我在我的应用程序中发现了一个奇怪的行为,其中连接的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相关问答推荐

在SwiftData中从@ Query创建可排序、有序和分组的数据

我想在expo 中使用useSafeAreaInsets来获取paddingbottom,但我得到了一个错误

SwiftUI中的视频时间轴

更改文本在Flutter 中的位置

比较 `某个协议` 实例时出现编译错误

如何使用 pushViewController 从 UIHostingController 的 SwiftUI 视图中推送 ViewController?

DllImport with .a file for iOS in MAUI

SwiftUI 菜单中的内联水平按钮

async/await、Task 和 [weak self]

在 Swift 中执行 while 循环

本月使用 iOS 的天数?

在 iOS 编程中使用 Storyboard 代替 xib 文件有什么好处?

'+entityForName: nil 不是合法的 NSManagedObjectContext 参数 - 核心数据

Xcode 项目格式:3.1、3.2、6.3 和 8.0 有什么区别?

Xcode:此时无法安装此应用程序.

快速从 NSTimeInterval 转换为小时、分钟、秒、毫秒

Swift 中的日期到毫秒和回溯到日期

使用 Xcode 的 All Exceptions 断点时忽略某些异常

如何在ios中生成UUID

Flutter:如何创建一个新项目