“viewWillTransitionToSize:”当视图控制器以模态方式呈现时在 iOS 9 中未调用

Posted

技术标签:

【中文标题】“viewWillTransitionToSize:”当视图控制器以模态方式呈现时在 iOS 9 中未调用【英文标题】:"viewWillTransitionToSize:" not called in iOS 9 when the view controller is presented modally 【发布时间】:2015-10-01 09:34:04 【问题描述】:

我展示了另一个视图控制器:

- (void)showModalView

   UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
   MySecViewController *mySecViewController = [storyboard instantiateViewControllerWithIdentifier:@"secController"];
   mySecViewController.delegate = self;
   [self presentViewController:mySecViewController animated:YES completion:nil];

然后在呈现的UIViewController中,方法viewWillTransitionToSize:withTransitionCoordinator:ios 8中被调用,但在iOS 9中没有被调用...

谢谢

【问题讨论】:

我也面临同样的问题。 【参考方案1】:

在您当前的视图控制器中,如果您覆盖viewWillTransitionToSize:withTransitionCoordinator:,请确保您调用super。否则,此消息不会传播到子视图控制器。

对于Objective-C

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

    // Your other code ... 

还有斯威夫特

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) 
    super.viewWillTransition(to: size, with: coordinator)

    // Your other code ...

【讨论】:

【参考方案2】:

人们已经解释过你必须调用super。我想添加一条信息,可能会帮助那些会面对我所面临的事情的人。

场景:父级 -> 子级(子级中未调用 viewWillTransition)


如果您的视图控制器是 child 视图控制器,则检查是否调用了 parent 视图控制器委托以及是否调用了 super。 否则不会传播到子视图控制器!

class ParentViewController: UIViewController 

    func presentChild() 
        let child = ChildViewController()
        present(child, animated: false, compeltion: nil)
    

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) 
        super.viewWillTransition(to: size, with: coordinator) // If this line is missing your child will not get the delegate call in it's viewWillTransition

        // Do something
    


class ChildViewController: UIViewController 

    // This method will not get called if presented from parent view controller and super is not called inside the viewViewWillTransition available there.
    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) 
       super.viewWillTransition(to: size, with: coordinator)

       //Do something
    


P.S - 这发生在我身上,因为父母的代码是由其他人编写的,他们忘记调用 super。

【讨论】:

为我工作!谢谢。但是super一般用于superClass。但在这里我可以看到 super 的不同实用程序。【参考方案3】:

这似乎是一个微不足道的案例,但在使用 iPad 时,请检查用户是否未在设置或控制面板或侧面按钮中激活旋转锁定

【讨论】:

【参考方案4】:

也许有点晚了,但我把这个放在这里是为了让任何人偶然发现这个令人沮丧的问题。

请记住,viewWillTransitionToSize:withTransitionCoordinator: 有时会在您期望的视图控制器的 presentingViewController 上被调用。 (如果那个视图控制器也有一个presentingViewController,它可能会被调用)

我无法真正弄清楚这背后的逻辑,但这就是我的重点。所以我不得不在我的许多视图控制器中覆盖viewWillTransitionToSize:withTransitionCoordinator:,如下所示:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

    [self.presentedViewController viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

【讨论】:

以上是关于“viewWillTransitionToSize:”当视图控制器以模态方式呈现时在 iOS 9 中未调用的主要内容,如果未能解决你的问题,请参考以下文章

viewWillTransitionToSize:withTransitionCoordinator: 未调用

为啥 `viewWillTransitionToSize` 中检索 SafeAreaInsets 的逻辑略有错误?

ViewWillTransitionToSize 在 Swift 3 中出现故障?

viewWillTransitionToSize 返回 iPhone 12 pro max 的错误尺寸 [重复]

viewWillTransitionToSize:withTransitionCoordinator: 和 layoutSubviews: 之间的交互

Swift viewWillTransitionToSize 不使用分屏调用