Swift - 呈现 UIView(不是 ViewController)

Posted

技术标签:

【中文标题】Swift - 呈现 UIView(不是 ViewController)【英文标题】:Swift - Present a UIView (not a ViewController) 【发布时间】:2019-11-18 20:59:27 【问题描述】:

我有两个UIViewControllers,我想.present 灰色UIView 就像你通常会呈现一个ViewController(出现自下而上,用户可以向下滑动以关闭)。

截图便于理解:

bottomBar 是ContainerView,不应通过在 VC 之间切换而改变,只有灰色的UIView,您可以在第二张图片中看到。

我知道我可以在没有动画的情况下只使用.presentViewControllerB,然后让UIView 从屏幕外出现。但是,如果我这样做,用户将无法将UIView 拖到dismiss 它。

这就是我目前呈现ViewControllerB ("wishlistViewController) 的方式。

let wishlistViewController = self.storyboard?.instantiateViewController(withIdentifier: "WishlistVC") as! WishlistViewController

        wishlistViewController.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext

        self.navigationController?.present(wishlistViewController, animated: false)

主要问题是我的UIView 不是全屏的。否则我只能.presentViewControllerB。但是,在我的设计中,背景图像也将由.presenting.dismissing 进行动画处理,我不希望这样。

这可能有一个非常简单的解决方案,但我找不到只提供UIView。 感谢任何提示:)

【问题讨论】:

您应该使用自定义标签栏视图而不是 + 按钮的容器视图。然后你可以有多个视图控制器,看起来像;) 对不起,我没有跟着你。 “可以有多个视图控制器”是什么意思? 每个项目都有一个视图控制器。所以触摸它们中的任何一个都会显示相应的视图控制器底部栏视图保持无缝。 抱歉,我的问题不清楚。 ViewControllerB 出现在用户单击cell 而不是底部栏后。我认为 BottomBar 与这个问题无关 你的问题到底是什么? 【参考方案1】:

嗯,我能想到两个答案:

1) 如果你愿意,你可以使用 UIView.animate() 在它所具有的 y 位置约束或其图层的 y 位置属性上从底部对其进行动画处理。然后,您可以将 UISwipeGestureRecognizer 附加到它,这样如果您向下滑动它,它就会动画回落。

2) 使您的视图成为您想要呈现的视图控制器,并使用自定义模态动画呈现它们。这听起来比你想做的工作要多。这是 youtube 上的一个很酷的教程,它将引导您了解如何在 2 个视图控制器之间创建自定义动画过渡: https://www.youtube.com/watch?v=B9sH_VxPPo4

但是,据我所知,那些 .dismiss 和 .present 方法适用于视图控制器。希望我提供的两个选项之一对您有所帮助!

【讨论】:

感谢您的回答!我不知道 UISwipeGestureRecognizer。我会试试看。 我尝试实现SwipeGesture,但获得与普通dismiss 函数相同的动画似乎相当复杂。关于如何使用自定义模态动画解决问题的任何想法?即使这可能需要更多的工作。 没关系。我实际上让它与 UISwipeGestureRecognizer 一起工作。谢谢! 太棒了!很高兴听到:)

以上是关于Swift - 呈现 UIView(不是 ViewController)的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中像 Tab View Controller 一样滑动 uiView

用动画呈现视图

自定义 UIView 类 - Swift

UIButton 的 Swift addTarget 在 UIView 中不起作用

Swift之动画总结

View 中的 IOS Swift 3 UILabel 无法正确呈现