[英]How to update the frameOfPresentedViewInContainerView when using custom modal presentation?
我正在使用自定义UIPresentationController以模态呈现视图。 呈现视图后,呈现的视图中的第一个文本字段将成为第一响应者,并显示键盘。 为了确保视图仍然可见,我将其向上移动。 但是,当我这样做时, frameOfPresentedViewInContainerView
不再与视图的实际框架匹配。 因此,当我点击视图时,该视图将被关闭,因为在presentingView顶部的backgroundView上有一个tapGestureRecogziner。 如何通知presentingController PresentedView的框架/位置已更改?
在UIPresentationController中:
override var frameOfPresentedViewInContainerView: CGRect {
var frame = CGRect.zero
let safeAreaBottom = self.presentingViewController.view.safeAreaInsets.bottom
guard let height = presentedView?.frame.height else { return frame }
if let containerBounds = containerView?.bounds {
frame = CGRect(x: 0,
y: containerBounds.height - height - safeAreaBottom,
width: containerBounds.width,
height: height + safeAreaBottom)
}
return frame
}
override func presentationTransitionWillBegin() {
if let containerView = self.containerView, let coordinator = presentingViewController.transitionCoordinator {
containerView.addSubview(self.dimmedBackgroundView)
self.dimmedBackgroundView.backgroundColor = .black
self.dimmedBackgroundView.frame = containerView.bounds
self.dimmedBackgroundView.alpha = 0
coordinator.animate(alongsideTransition: { _ in
self.dimmedBackgroundView.alpha = 0.5
}, completion: nil)
}
}
模态呈现视图:
let overlayVC = CreateEventViewController()
overlayVC.transitioningDelegate = self.transitioningDelegate
overlayVC.modalPresentationStyle = .custom
self.present(overlayVC, animated: true, completion: nil)
出现键盘时的动画(在显示的视图中):
@objc func animateWithKeyboard(notification: NSNotification) {
let userInfo = notification.userInfo!
guard let keyboardHeight = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.height,
let duration = userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double,
let curve = userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? UInt else {
return
}
// bottomContraint is the constraint that pins content to the bottom of the superview.
let moveUp = (notification.name == UIResponder.keyboardWillShowNotification)
bottomConstraint.constant = moveUp ? (keyboardHeight) : originalBottomValue
let options = UIView.AnimationOptions(rawValue: curve << 16)
UIView.animate(withDuration: duration, delay: 0,
options: options,
animations: {
self.view.layoutIfNeeded()
}, completion: nil)
}
从Apple文档中:
在演示过程中,UIKit多次调用此方法,因此您的实现每次应返回相同的框架矩形。 不要使用此方法更改视图层次结构或执行其他一次性任务。
AFAIK,如果通过此变量指定框架,建议在整个演示过程中不要更改它。 如果您打算使用框架,请不要指定此变量并在动画师中手动处理所有更改
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.