• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 所有 Controller 上的快速播放器小部件

[复制链接]
菜鸟教程小白 发表于 2022-12-11 19:45:26 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在我的应用程序中制作广播播放器。并希望拥有带有信息 + 控制按钮的小部件,在播放时将在应用程序中的所有 Controller 上持续存在。就像在 iTunes 中或像 google chromecast 容器一样,它将从底部推送其他 View Controller 的所有元素(不是覆盖元素)

enter image description here

我知道叠加 View 可以在 appdelegate 中添加到 keywindow,正如 GoogleCast Container 添加的那样:

let appStoryboard = UIStoryboard(name: "Main", bundle: nil)
let navigationController = appStoryboard.instantiateViewController(withIdentifier: "MainNavigation")
let castContainerVC: GCKUICastContainerViewController = GCKCastContext.sharedInstance().createCastContainerController(for: navigationController)
castContainerVC.miniMediaControlsItemEnabled = true
self.window = UIWindow(frame: UIScreen.main.bounds)
self.window?.rootViewController = castContainerVC
self.window?.makeKeyAndVisible()

但我不明白,我如何设计和实例化我的 Controller + 将其添加到窗口 + 在没有播放内容时隐藏。

我忘了提一下,那个应用程序已经启动并运行了。导航栏内大约有 30 个 View Controller



Best Answer-推荐答案


我会在当前窗口的顶部创建一个窗口,我会在其中放置 radio View 。然后单选 View 将始终位于标准窗口中 View 层次结构的顶部。要允许单选窗口下的标准窗口处理触摸事件,您需要覆盖单选窗口中的 hitTest 以确保它不会处理不应由它处理的事件.

你可以以此为例:

import UIKit

class RadioController: UIViewController {

    fileprivate struct Static {
        static let window: UIHigherWindow = {
            let window = UIHigherWindow(frame: UIScreen.main.bounds)
            window.rootViewController = RadioController()
            window.windowLevel = UIWindowLevelAlert - 1
            return window
        }()
    }

    override func loadView() {
        // use passView, as it will pass the touch events tu underlying window
        self.view = PassView()
        self.view.backgroundColor = UIColor.clear
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // configure whatever subview you want, in your case the radio view
        let radioView = UIView(frame: CGRect(x: 0, y: UIScreen.main.bounds.height - 50, width: UIScreen.main.bounds.width, height: 50))
        radioView.backgroundColor = .red
        self.view.addSubview(radioView)
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        // this will now define the status bar style, as it will become the topmost window for most of the time
        return .default
    }

    static var showing: Bool {
        get {
            return !Static.window.isHidden
        }
    }

    static func present() {
        Static.window.isHidden = false
    }

    static func hide() {
        Static.window.isHidden = true
    }
}

// MARK: Passing touch events to the back view
class PassView: UIView {}

class UIHigherWindow: UIWindow {

    // this will allow touch events to be processed by the default window
    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        let hitView = super.hitTest(point, with: event)
        if hitView!.isKind(of: PassView.self) {
            return nil
        }
        return hitView
    }
}

关于ios - 所有 Controller 上的快速播放器小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48812883/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap