如何解决iOS-自定义过渡动画没有反弹效果
我遵循了这个answer,但是在布局中使用了锚点。过渡本身很好,问题在于动画发生并且视图出现在屏幕上时,链接中没有像gif那样的反弹。我的动画只是从底部“出现”,而不是从底部过渡。这是非常突然的,而不是平稳的。
我没有像下面的代码那样使用UIView.Animate...
,而是尝试了animate(withDuration:delay:usingSpringWithdamping:initialSpringVeLocity:options:animations:completion:)
,但仍然没有跳动。
我在completionHandler中尝试了containerView.setNeedsUpdateConstraints()
,containerView.layoutIfNeeded()
,view.layoutIfNeeded()
的不同组合,但使用了nada。我使用withDuration:
从0.4到2.5进行游戏,但同样突然出现
实际的过渡效果很好,所以我在那里很好,只是它出现时没有反弹效果
class ViewController: UIViewController {
init() {
super.init(nibName: nil,bundle: nil)
modalPresentationStyle = .custom
transitioningDelegate = self
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
lazy var bgView: UIView = {
let v = UIView()
v.translatesAutoresizingMaskIntoConstraints = false
v.backgroundColor = UIColor.black.withAlphaComponent(0.7)
return v
}()
let anotherVC = AnotherController()
var isPresenting = false
let fullScreenHeight = UIScreen.main.bounds.height
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .clear
configureAnchors()
let navVC = UINavigationController(rootViewController: anotherVC)
addChildVCToParent(vc: navVC)
}
func addChildVCToParent(vc: UIViewController) {
if (!vc.view.isDescendant(of: self.view)) {
addChild(vc)
vc.view.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(vc.view)
vc.didMove(toParent: self)
vc.view.topAnchor.constraint(equalTo: bgView.bottomAnchor).isActive = true
vc.view.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
vc.view.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true
vc.view.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
}
}
var bgViewHeightAnchor: NSLayoutConstraint?
func configureAnchors() {
view.addSubview(bgView)
bgView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
bgView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
bgView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
setBgViewHeightAnchorToFullScreenHeightAndAlphaToZero()
}
func setBgViewHeightAnchorToFullScreenHeightAndAlphaToZero() {
bgView.alpha = 0
bgViewHeightAnchor?.isActive = false
bgViewHeightAnchor = bgView.heightAnchor.constraint(equalToConstant: fullScreenHeight)
bgViewHeightAnchor?.isActive = true
}
func setBgHeightAnchorToOneFifthScreenHeightAndAlphaToOne() {
bgView.alpha = 1
bgViewHeightAnchor?.isActive = false
bgViewHeightAnchor = bgView.heightAnchor.constraint(equalToConstant: fullScreenHeight / 5)
bgViewHeightAnchor?.isActive = true
}
}
extension ViewController: UIViewControllerTransitioningDelegate,UIViewControllerAnimatedTransitioning {
func animationController(forPresented presented: UIViewController,presenting: UIViewController,source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return self
}
func animationController(fordismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return self
}
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 1
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
let containerView = transitionContext.containerView
let toViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)
guard let toVC = toViewController else { return }
isPresenting = !isPresenting
if isPresenting {
containerView.addSubview(toVC.view)
setBgViewHeightAnchorToFullScreenHeightAndAlphaToZero()
// containerView.setNeedsUpdateConstraints()
UIView.animate(withDuration: 0.4,delay: 0,options: [.curveEaSEOut],animations: {
self.setBgViewHeightAnchorToOneFifthScreenHeightAndAlphaToOne()
// containerView.layoutIfNeeded() // using this here ruins the entire animation
// self.view.layoutIfNeeded()
},completion: { (finished) in
// containerView.layoutIfNeeded()
// self.view.layoutIfNeeded()
transitionContext.completeTransition(true)
})
} else {
UIView.animate(withDuration: 0.4,animations: {
self.setBgViewHeightAnchorToFullScreenHeightAndAlphaToZero()
},completion: { (finished) in
transitionContext.completeTransition(true)
})
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。