我的回答是:你不应该在自定义模态演示的情况下使用约束
因此我知道你的痛苦,所以我会通过提供一些我突然透露的提示来帮助你节省时间和精力。
示例案例:
卡片界面动画如下:
进一步使用条款:
-
父级 -
UIViewController 带有“详细信息”栏按钮项
-
孩子 -
UIViewController 和“另一个”
你提到的麻烦开始了,当我的动画涉及随着运动的大小变化时。它会引起不同类型的影响,包括:
- 父母的状态栏下方区域出现和消失
- 父子视图的动画效果不佳 - 跳跃、重复和其他故障。
经过几天的调试和搜索,我想出了以下解决方案(对不起,一些神奇的数字;)):
UIView.animate(withDuration: transitionDuration(using: transitionContext),
delay: 0,
usingSpringWithDamping: 1,
initialSpringVelocity: 0.4,
options: .curveEaseIn, animations: {
toVC.view.transform = CGAffineTransform(translationX: 0, y: self.finalFrame.minY)
toVC.view.frame = self.finalFrame
toVC.view.layer.cornerRadius = self.cornerRadius
fromVC.view.layer.cornerRadius = self.cornerRadius
var transform = CATransform3DIdentity
transform = CATransform3DScale(transform, scale, scale, 1.0)
transform = CATransform3DTranslate(transform, 0, wdiff, 0)
fromVC.view.layer.transform = transform
fromVC.view.alpha = 0.6
}) { _ in
transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
}
这里的重点是,您必须使用 CGAffineTransform3D 来避免动画问题和子视图动画问题(2D 变换由于未知原因无法正常工作)。
我希望这种方法可以在不使用约束的情况下解决您的所有问题。
欢迎提问。
UPD:根据通话状态栏
经过数小时的所有可能的实验并检查类似的项目,如 this 和 this 以及 stackoverflow 问题,如 this、this(这实际上很有趣,OP 的答案就在那里)和类似的我完全糊涂了。似乎我的解决方案在 UIKit 级别处理双状态栏(它可以正确调整),但同样的动作忽略了以前的转换。原因不明。
代码示例:
您可以在Github 上查看工作解决方案
P.S.我不确定是否可以在答案中发布 GitHub 链接。对于如何在答案中发布 100-300 行代码的建议,我将不胜感激。