【问题标题】:"viewWillTransitionToSize:" not called in iOS 9 when the view controller is presented modally“viewWillTransitionToSize:”当视图控制器以模态方式呈现时在 iOS 9 中未调用
【发布时间】: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中没有被调用...

谢谢

【问题讨论】:

  • 我也面临同样的问题。

标签: ios uiviewcontroller screen-orientation autorotate presentviewcontroller


【解决方案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];
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-14
        • 1970-01-01
        • 2011-01-20
        • 1970-01-01
        • 2016-02-03
        • 1970-01-01
        • 1970-01-01
        • 2013-04-15
        相关资源
        最近更新 更多