在iOS7而不是iOS8中,viewdidload和viewwillappear之间的帧大小会发生变化

时间:2015-03-31 15:37:32

标签: ios objective-c

我有一个从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

这很明显地显示了问题。

2 个答案:

答案 0 :(得分:7)

永远不要依赖viewDidLoad / viewWillAppear中的框架和边界值。通常,监听大小更改的最精确位置是viewDidLayout,您可以在其中跟踪上次看到的大小,并在大小更改时执行逻辑。

viewDidAppear是精确的,但是在视图已经动画化后调用,所以你会看到一个丑陋的跳跃。正如我之前提到的,viewWillLayout / viewDidLayout通常是最精确的。

答案 1 :(得分:-1)

大小类可能有问题吗?尝试配置(请参阅About Designing for Multiple Size Classes)或禁用它。

File Inspector - Size Classes