【问题标题】:Swift Presenting Controller Dismiss Bar IndicatorSwift Presenting Controller Dismiss Bar Indicator
【发布时间】:2020-02-11 09:44:46
【问题描述】:

对于大多数人来说,这应该是一个简单的问题。像所附照片一样呈现视图控制器现在在它们的顶部有一个栏(见红色箭头),表示用户可以向下滑动以关闭控制器。请帮助解决以下任何问题:

  • 这个图标的正确术语是什么?
  • 它是 swift 的 ui 工具/库的一部分,还是只是一个 UIImage?
  • 谁能提供一个简单的 sn-p 来说明如何实现 - 也许它类似于下面的代码
let sampleController = SampleController()
sampleController.POSSIBLE_OPTION_TO_SHOW_BAR_ICON = true
present(sampleController, animated: true, completion: nil)

Please see the red arrow for the icon that I am referring to

【问题讨论】:

  • 您找到解决此要求的方法了吗?我目前正在寻求与您的要求完全相同的解决方案。
  • 呃,不完全是。我了解到您确实需要自己构建它,并且它不是 Swift UI / Library 的一部分。但是,我不知道图标的名称是什么。如果你发现了这个,请告诉我。
  • 谢谢@loongman。这是一篇很棒的文章,但我有一个问题。它在第 7 步中提到将 UI 视图添加为“句柄”视图。这对我来说是我们图标的答案,但它没有说明如何做到这一点。如何将 UI 视图添加为“句柄”视图?下面是这个图片的链接。 iosimage.s3.amazonaws.com/2019/62-bottom-card/step7.png
  • 在我的例子中,“Handle”视图被添加为一个常规的 UIView,大小为 (36, 4),cornerRadius (2),加上某些 backgroundColor,到昏暗的视图中。并将卡片视图的底部固定到顶部,因此,每当卡片视图滚动时,句柄视图也会滚动。

标签: ios swift uipresentationcontroller


【解决方案1】:

UIKit 中没有您要求的功能。

您必须使用子类化 UIPresentationController 来实现自定义视图控制器过渡动画,以呈现上拉/下拉句柄。

UIPresentationController (developer.apple.com)

对于自定义展示,您可以提供自己的展示控制器来为展示的视图控制器提供自定义外观。演示控制器管理任何与视图控制器及其内容分开的自定义镶边。例如,放置在视图控制器视图后面的调光视图将由表示控制器管理。 Apple Documentation

这可以通过任何UIView 来实现,或者您可以通过在presentedView 上方将子视图添加到UIPresentationController 的contentView 来使用任何图像。

要提供滑动手势以关闭/呈现,您必须实现UIPercentDrivenInteractionController

详细了解可以参考下面这个教程。

UIPresentationController Tutorial By raywenderlich.com

你应该在你的情况下寻找presentationDirection = .bottom

对于手势驱动的关闭,您应该查看以下教程

Custom-UIViewcontroller-Transitions-getting-started

希望对你有所帮助。

【讨论】:

    【解决方案2】:

    如果您不想做任何自定义演示而只使用默认转换,则需要在 正在呈现的视图控制器中添加此指示器。

    首先要考虑的是您的视图层次结构,指示器是否会成为导航栏的一部分,或者您的视图可能没有导航栏 - 因此您可能需要一些代码来找到正确的视图来添加它指标。

    在我的场景中,我需要一个导航栏,因此我的视图控制器位于导航控制器中,但您可以直接在视图控制器中执行相同操作:

    1:子类化导航控制器

    这是可选的,但最好将所有这些自定义抽象到导航控制器中。

    我检查一下是否显示了 NavigationController。这可能不是最好的检查方法,但由于这不是问题的一部分,请参阅these answers 检查视图控制器是否以模态方式呈现

    class CustomNavigationController: UINavigationController {
      override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        // this checks if the ViewController is being presented
        if presentingViewController != nil {
          addModalIndicator()
        }
      }
    
      private func addModalIndicator() {
        let indicator = UIView()
        indicator.backgroundColor = .tertiaryLabel
        let indicatorSize = CGSize(width: 30, height: 5)
        let indicatorX = (navigationBar.frame.width - indicatorSize.width) / CGFloat(2)
        indicator.frame = CGRect(origin: CGPoint(x: indicatorX, y: 8), size: indicatorSize)
        indicator.layer.cornerRadius = indicatorSize.height / CGFloat(2.0)
        navigationBar.addSubview(indicator)
      }
    }
    

    2:呈现自定义导航控制器

    let someVC = UIViewController()
    let customNavigationController = CustomNavigationController()
    customNavigationController.setViewControllers([stationsVC], animated: false)
    present(playerNavigationController, animated: true) { }
    

    3:这将产生以下结果

    您可能需要根据您的场景/视图控制器层次结构在此处更改一些逻辑,但希望这能给您一些想法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 2016-12-20
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      相关资源
      最近更新 更多