gpt4 book ai didi

ios - UIViewController 转换在使用下拉手势关闭时闪烁

转载 作者:行者123 更新时间:2023-11-30 12:03:09 27 4
gpt4 key购买 nike

当用户使用自定义转换单击 MKMapView 中的注释时,我将呈现一个 View Controller 。该转换使所呈现的 View Controller 的框架从注释的框架开始动画化到其最终的全屏外观。

当关闭呈现的 View Controller 时,用户有两个选择:她可以单击右上角的关闭按钮,关闭过渡将使 View 以动画方式返回到注释的框架。这部分工作正常。

但是用户也可以将 View 向下拖动至少 200 点,当她抬起手指时,我希望运行相同的关闭转换,但从“向下拖动”状态开始。

更详细地说,我呈现的 View Controller 的 Root View 有两个 subview :一个我称之为 contentView,它保存所有实际内容,并且是一个具有 UIPanGestureRecognizer 的 subview 定义在其上并根据用户的手势向下移动;我称之为 pullProgressView ,它位于 contentView 下方,并在用户拖动时保持在原位。它显示一个圆圈,该圆圈填满用户已经拖动的位置,以指示在哪个点释放手指将关闭 View Controller 。

手势识别器的基本部分如下所示:

let progress = sender.translation(in: contentView).y
let screen = UIScreen.main.bounds

if sender.state == .began || sender.state == .changed {
if progress > 0 {
// Dragged down -> allow movement of the view
contentView.center = CGPoint(x: contentView.center.x,
y: screen.size.height / 2 + progress)
}
} else if sender.state == .ended {
if contentView.frame.origin.y > threshold {
// Dragged down far enough to dismiss the view controller
print("contentView frame right before dismissing: \(contentView.frame)")
self.dismissView()
} else {
// Not dragged down far enough, animate the view back
// to its original position
UIView.animate(withDuration: 0.3) {
self.contentView.frame = screen
}
}
}

我的 animateTransition 方法在我调用 dismissView() 时接管,包含以下代码:

let contentView = (transitionContext.viewController(forKey: .from) as! PresentedViewController).contentView!
print("contentView frame going into animateTransition: \(contentView.frame)")

问题是,当我在向下拖动 View Controller 后抬起手指关闭 View Controller 时, View “闪烁”回到其原始的未拖动状态。上述代码片段中的两个 print 语句产生以下输出:

contentView frame right before dismissing: (0.0, 330.0, 375.0, 667.0)
contentView frame going into animateTransition: (0.0, 0.0, 375.0, 667.0)

因此,contentView 的框架不会“存活”到 animateTransition 方法中(请注意 y 参数)。我可以通过询问 UIPanGestureRecognizer 的进度来从 animateTransition 中手动设置它,这是有效的,但在 contentView 之前仍然存在难看的闪烁被移回到其向下拖动的框架。

有人知道如何解决这个问题吗?或者解决这个问题的更好方法?我读过有关 UIPercentDrivenInteractiveTransition 的内容,但它适用于我的情况吗?向下拖动手势并不会真正产生实际关闭动画的任何百分比(这会将帧变形回 map 注释之一),因此我不知道如何使用 UIPercentDrivenInteractiveTransition 解决问题.

最佳答案

我找到了使用 View Controller 包含的不同解决方案。基本上,我将一个 subview Controller 及其 View 作为 subview 添加到呈现 View Controller 中。此外,我将 pullProgressView 添加为 subview Controller View 下方的 subview 。

这样我就不必依赖转换委托(delegate),而是可以在完成所有动画处理后自行处理 subview Controller 的关闭。

关于ios - UIViewController 转换在使用下拉手势关闭时闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46975716/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com