При сворачивании представления содержимое контроллера root также минимизирует swift - PullRequest
1 голос
/ 19 июня 2020

Привет, я пытаюсь воссоздать контроллер миниплеера Apple Musics. Существует представление, которое показывает подробную информацию о воспроизводимой песне, такую ​​как название песни, имя исполнителя, обложку и т. Д., Например, apple musi c. Когда пользователь нажимает кнопку закрытия в верхней части этого контроллера, он минимизирует его до представления чуть выше 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



    }
}

функция, вызываемая в songcontroller:

   @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()

        }

Скриншоты происходящего:

Нормальный вид: normal view

Свернутый вид: minimized view

1 Ответ

0 голосов
/ 19 июня 2020

Если вы создали TabBarController с помощью раскадровки, то предоставленная вами пустая инициализация не будет работать. Вам нужно создать экземпляр UIViewController из раскадровки. Кажется, это причина, по которой вы получаете пустой UITabBarController при установке rootViewController. Измените действие кнопки dismissTapped следующим образом:

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