我有一个从xib加载的视图控制器。我正在使用代码中的大小 - 它都是在XIB文件中设置的。我有记录集显示iniwithnibname具有正确的宽度和高度,viewdidload具有正确的宽度/高度,viewwillappear具有错误的宽度/高度。
宽度/高度会更改为我的代码中不存在的值。
这是一款仅限iPad风景的应用程序,在7.1中的模拟器中运行它显示它已损坏,8.2显示它没问题。
任何人都可以对此有所了解吗?
这是我如何使用xib加载VC:
ShareViewController *shareViewController = [[ShareViewController alloc] initWithNibName:@"ShareViewController" bundle:nil imageName:imageSelected ];
shareViewController.modalPresentationStyle = UIModalPresentationFormSheet;
float fW = shareViewController.view.frame.size.width;
float fH = shareViewController.view.frame.size.height;
shareViewController.preferredContentSize = CGSizeMake(fW, fH);
[self presentViewController:shareViewController animated:YES completion:^(){}];
在iOS8模拟器中这里是NSLog输出:
KIStd[28103:762368] Entering ShareButtonPressed
KIStd[28103:762368] initWithNibName/image entry
KIStd[28103:762368] viewDidLoad entry
KIStd[28103:762368] viewDidLoad exit w:596.000000, h:400.000000
KIStd[28103:762368] initWithNibName/image exit w:596.000000, h:400.000000
KIStd[28103:762368] viewWillAppear Entry w:596.000000, h:400.000000
KIStd[28103:762368] viewWillAppear exit w:596.000000, h:400.000000
KIStd[28103:762368] viewDidAppear entry
KIStd[28103:762368] viewDidAppear exit w:596.000000, h:400.000000
在iOS7模拟器中这里是NSLog输出:
KIStd[28186:60b] Entering ShareButtonPressed
KIStd[28186:60b] initWithNibName/image entry
KIStd[28186:60b] viewDidLoad entry
KIStd[28186:60b] viewDidLoad exit w:596.000000, h:400.000000
KIStd[28186:60b] initWithNibName/image exit w:596.000000, h:400.000000
KIStd[28186:60b] viewWillAppear Entry w:540.000000, h:620.000000
KIStd[28186:60b] viewWillAppear exit w:540.000000, h:620.000000
KIStd[28186:60b] viewDidAppear entry
KIStd[28186:60b] viewDidAppear exit w:540.000000, h:620.000000
这很明显地显示了问题。
答案 0 :(得分:7)
永远不要依赖viewDidLoad
/ viewWillAppear
中的框架和边界值。通常,监听大小更改的最精确位置是viewDidLayout
,您可以在其中跟踪上次看到的大小,并在大小更改时执行逻辑。
viewDidAppear
是精确的,但是在视图已经动画化后调用,所以你会看到一个丑陋的跳跃。正如我之前提到的,viewWillLayout
/ viewDidLayout
通常是最精确的。
答案 1 :(得分:-1)
大小类可能有问题吗?尝试配置(请参阅About Designing for Multiple Size Classes)或禁用它。