问题:
在调用状态栏消失后,模态呈现的视图控制器不会向上移动,在顶部留下20px空/透明空间.
正常:没有问题
在电话:没有问题
在呼叫消失后:
在顶部留下20px高的空/透明空间,露出下面的橙色视图.但是,状态栏仍然存在于透明区域上方.导航栏还为状态栏留出空间,它的位置只有20px太低.
我试着听App代表:
willChangeStatusBarFrame
didChangeStatusBarFrame
Run Code Online (Sandbox Code Playgroud)
还可以查看基于控制器的通知:
UIApplicationWillChangeStatusBarFrame
UIApplicationDidChangeStatusBarFrame
Run Code Online (Sandbox Code Playgroud)
当我为所有上述四种方法记录呈现视图的帧时,帧始终位于(y:0)原点.
查看控制器自定义模式演示
let storyboard = UIStoryboard(name: "StoryBoard1", bundle: nil)
self.modalVC = storyboard.instantiateViewController(withIdentifier: "My Modal View Controller") as? MyModalViewController
self.modalVC!.transitioningDelegate = self
self.modalVC.modalPresentationStyle = .custom
self.modalVC.modalPresentationCapturesStatusBarAppearance = true;
self.present(self.modalVC!, animated: true, completion: nil)
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
let containerView = transitionContext.containerView
let fromViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from)
let toViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)
toViewController!.view.transform = CGAffineTransform(scaleX: 0.001, …
Run Code Online (Sandbox Code Playgroud) 我已经阅读了Apple关于自定义模式演示文稿的所有文档,但我找不到这个答案.当使用自定义动画呈现视图控制器时,我们可以返回3个内容(如果转换不是交互式的,交互式可以返回4个):呈现控制器和两个动画控制器(一个用于存在,一个用于解除).
在演示控制器和当前动画控制器中,Apple的代码都不包含约束.关于框架的讨论范围是Apple建议在当前动画控制器中设置所呈现的视图控制器视图的框架(如下):
// Always add the "to" view to the container.
// And it doesn't hurt to set its start frame.
[containerView addSubview:toView];
toView.frame = toViewStartFrame;
Run Code Online (Sandbox Code Playgroud)
......就是这样.
我遇到的问题是模拟器(以及我拥有的设备)中的这些呈现的视图控制器无法识别双高状态栏.更确切地说,没有一种解决方案适用于所有模拟器 - 在新模拟器(如iPhone 8)中工作的解决方案在旧的模拟器(如iPhone 5)中不起作用.如果我让Apple使用默认的UIKit动画来处理演示文稿,则所呈现的视图控制器可以很好地处理双高状态栏.因此,我可以假设所呈现的视图控制器中的约束不是问题.
所以我转向演示控制器containerViewDidLayoutSubviews
和containerViewWillLayoutSubviews
方法,没有任何运气:
override func containerViewDidLayoutSubviews() {
super.containerViewDidLayoutSubviews()
presentedViewController.view.frame = containerView!.bounds
}
Run Code Online (Sandbox Code Playgroud)
上面的代码仅在第一次引入双高状态栏时才在模拟器中工作; 从那以后,这种方法变得反应迟钝.要验证这一点:
override func containerViewDidLayoutSubviews() {
super.containerViewDidLayoutSubviews()
presentedViewController.view.frame = containerView!.bounds
print("did layout")
}
Run Code Online (Sandbox Code Playgroud)
在首次引入双高状态栏后,上述方法停止打印到控制台.但是,如果我将任务更改为不会改变所呈现视图框架大小的内容,例如更改其背景颜色:
override func containerViewDidLayoutSubviews() {
super.containerViewDidLayoutSubviews()
presentedViewController.view.backgroundColor = UIColor.blue
print("did layout")
}
Run Code Online (Sandbox Code Playgroud)
方法永远不会破坏.无论出于何种原因,在此方法中更改显示的视图框架的大小会在双高度状态栏的第一个切换之后中断该方法.我很想解释这种行为.不太可能是一个bug,但看起来像一个.
无论如何,Apple说如果正确使用自动布局,程序员就什么都不做!所以我的问题是,我们应该在何处或如何给出所呈现的视图控制器的视图约束,以便它可以适应其临时容器?因为,IMO,那就是问题所在.呈现的视图控制器由转换的容器视图拥有,该视图是由UIKit提供的临时视图,我们没有太多的主导权.如果我们可以将呈现的视图锚定到该容器,则所有问题都将得到解决.但我从未见过苹果这样做,甚至没有谈过这个.
注:显式锚定所呈现的视图到所述容器的任何地方视图 - 在本动画控制器(动画其完成处理程序之前或在)中,在呈现控制器,或在自适应委托方法 - 如所提到的不产生一致的结果早. …
我想询问有关自动布局和通话状态栏的信息.这是一个简单的场景,演示了我的问题:
表视图应具有4个布局约束(前导,顶部,尾部,底部)到Superview,常量设置为0.
现在,当我在模拟器中运行此应用程序并按⌘+时,T我可以看到红色背景,而在通话状态栏动画.是否有可能摆脱这个故障?