【问题标题】:When minimizing a view, root controller contents also minimize swift最小化视图时,根控制器内容也会最小化 swift
【发布时间】:2020-10-09 05:31:00
【问题描述】:

您好,我正在尝试重新创建 Apple Music 迷你播放器控制器。有一个视图显示有关歌曲播放的详细信息,例如歌曲名称、艺术家姓名、封面艺术等,如苹果音乐。当用户单击该控制器顶部的关闭按钮时,它会将其最小化为 tabBar 正上方的视图,显示视图后面的根视图。唯一的问题是我的代码导致了一个问题,即当视图最小化时,它不是最小化显示当前正在播放的歌曲信息的视图,而是最小化所有视图并只留下黑屏。我不确定是什么导致了问题,但我将为我的 tabBar 控制器提供代码,该控制器包含代码以最小化和最大化视图,然后另一个控制器调用在 tabBar 控制器中创建的函数以最小化和最大化视图以及正在发生的事情的屏幕截图。感谢您花时间看这个。如果有任何不清楚的地方,请告诉我。

TabBarController 代码:

import Foundation
import UIKit
import Firebase

class TabBarController: UITabBarController {

    var user: User? {
        didSet {
            guard let nav = viewControllers?[0] as? UINavigationController else { return }
            guard let feed = nav.viewControllers.first as? FeedController else { return }
            feed.user = user
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        fetchUser()

        setupDetailsPlayerView()

//        perform(#selector(minimizePlayerDetails), with: nil, afterDelay: 1)
//        perform(#selector(maximizePlayerDetails), with: nil, afterDelay: 1)
    }


    @objc func minimizePlayerDetails() {

        maximizeTopAnchorConstraint.isActive = false
        minimizeTopAnchorConstraint.isActive = true

        UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.7, initialSpringVelocity: 1, options: .curveEaseOut, animations: {

//            self.view.layoutIfNeeded()

        })
    }

    @objc func maximizePlayerDetails() {
        maximizeTopAnchorConstraint.isActive = true
        maximizeTopAnchorConstraint.constant = 0
        minimizeTopAnchorConstraint.isActive = false

        UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.7, initialSpringVelocity: 1, options: .curveEaseOut, animations: {

            self.view.layoutIfNeeded()

        })

    }

    func fetchUser() {
        guard let uid = Auth.auth().currentUser?.uid else { return }
        UserService.shared.fetchUser(uid: uid) { user in
            self.user = user
        }
    }


    let playerDetailsView = PlayerDetailController.initFromNib()

    var maximizeTopAnchorConstraint: NSLayoutConstraint!
    var minimizeTopAnchorConstraint: NSLayoutConstraint!

    fileprivate func setupDetailsPlayerView() {
        print("setting up details view")

//        view.addSubview(playerDetailsView)
        view.insertSubview(playerDetailsView, belowSubview: tabBar)


        playerDetailsView.translatesAutoresizingMaskIntoConstraints = false

        maximizeTopAnchorConstraint = playerDetailsView.topAnchor.constraint(equalTo: view.topAnchor, constant: view.frame.height)
        maximizeTopAnchorConstraint.isActive = true

        minimizeTopAnchorConstraint = playerDetailsView.topAnchor.constraint(equalTo: tabBar.topAnchor, constant: -64)
//        minimizeTopAnchorConstraint.isActive = true

        playerDetailsView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
        playerDetailsView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
        playerDetailsView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true



    }
}

在歌曲控制器中调用的函数:

   @IBAction func dismissTapped(_ sender: Any) {

            guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
                let sceneDelegate = windowScene.delegate as? SceneDelegate
                else {
                    return
            }
            let viewController = TabBarController()
            sceneDelegate.window?.rootViewController = viewController
            viewController.minimizePlayerDetails()
            print("clicked")
            self.removeFromSuperview()

        }

正在发生的事情的屏幕截图:

普通视图:

最小化视图:

【问题讨论】:

    标签: swift uiviewcontroller uitabbarcontroller


    【解决方案1】:

    如果您通过情节提要创建了TabBarController,那么您提供的空初始化将不起作用。您需要从情节提要中实例化 UIViewController。这似乎是您在设置rootViewController 时得到一个空的UITabBarController 的原因。像这样修改您的按钮操作dismissTapped

    @IBAction func dismissTapped(_ sender: Any) {
        //...
        let viewController = UIStoryboard(name: "Main", bundle: nil)
            .instantiateViewController(withIdentifier: "TabBarController") as? TabBarController
        sceneDelegate.window?.rootViewController = viewController
        //...
    }
    

    【讨论】:

    • 所以这段代码有效,我不再有看到黑屏的问题。唯一的问题是,当我在从我的选项卡栏中选择的另一个视图控制器上并且我关闭视图时,视图最小化但将我带回选项卡栏上的第一个控制器,在这种情况下,它会将我带到每个都有房子符号的视图控制器时间我解雇它。有关如何解决此问题的任何建议?
    • 我不确定,你为什么不问这个作为解释细节的后续问题并在这里发布链接,我一定会看看?顺便说一句,如果此答案有助于解决您遇到的黑屏问题,则将其标记为正确并投票。
    猜你喜欢
    • 2013-04-17
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多