如何在 NavigationController 和 UITabbar 上方显示 UIView?

How to display an UIView above NavigationController and UITabbar?

我正在尝试创建一个自定义 Actionsheet 控制器(因为我希望它与 sheet 甚至在 iPad 上的操作相似)。我在我的项目中使用 XIB 来加载视图。

我有一个 View Controller A,我想从底部显示一个自定义 Table 视图(只是为了模仿 actionSheet 行为)。但是当我通过将它添加到我的视图控制器 A 中的自定义视图来这样做时,视图保持在该视图控制器的 NavigationController 和 UITababar 下方。

    let vc = CustomActionTableViewController(nibName: "CustomActionTableViewController", bundle: nil)
    self.addChildViewController(vc)
    self.actionView.addSubview(vc.view)
    vc.didMove(toParentViewController: self)
    let horzConstraints = NSLayoutConstraint.constraints(withVisualFormat: "H:|[childView]|", options: [], metrics: nil, views: ["childView": vc.view])

    let vertConstraints = NSLayoutConstraint.constraints(withVisualFormat: "V:|[childView]|", options: [], metrics: nil, views: ["childView": vc.view])

    view.addConstraints(horzConstraints)
    view.addConstraints(vertConstraints)
    vc.view.translatesAutoresizingMaskIntoConstraints = false

我想将它添加到视图中,这样即使在导航控制器和 UITabbar 上我也可以实现透明背景。

我怎样才能做到这一点。此外,如何创建用于 AirPods 连接的类似底部视图的卡片?可以使用 Apple 的 UIKit 或任何库来模仿这种视图吗?

你应该 present 这个 ViewControllermodalPresentationStyle 作为 .overFullScreen

let vc = CustomActionTableViewController(nibName: "CustomActionTableViewController", bundle: nil)
vc.modalPresentationStyle = .overFullScreen
self.present(vc, animated: true, completion: nil)

您可以将 CustomActionTableViewControllerview 的背景 color 设置为黑色,并更改 alpha 值以设置透明度。

import UIKit

class SetupSheet: UIViewController {
    var content: UIView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha: 0.6)
        
    }

    override func viewDidAppear(_ animated: Bool) {
        displaySetupSheet()
    }

    private func displaySetupSheet() {
        content.frame = CGRect(x: 8, y: view.frame.maxY, width: view.bounds.width - 16 , height: view.bounds.height / 2)
        content.backgroundColor = .white
        content.layer.cornerRadius = 30
        self.view.addSubview(content)
        
        UIView.animate(withDuration: 0.2, delay: 0.0, options: UIView.AnimationOptions.transitionCurlUp) {
            self.content.frame.origin.y -= (self.view.bounds.height / 2) + 16
        }
    }
}

我知道这个 post 有点老了,但我尝试了很多东西,这可能会对某些人有所帮助。这是一个完成的可重复使用的“Airpod”样式设置 sheet。它是一个视图控制器,因此您可以使用 present() 显示它。初始化时,将包含要显示的任何内部内容的 UIView 分配给内容。 Here's a pic used in my app