Использование значения CGFloat из ViewController для перемещения представления в TabBarController в Swift - PullRequest
1 голос
/ 31 января 2020

Я так близко, чтобы просто выбросить свой ноутбук. В течение 3 дней, опять же, 3 дня я ищу этот конкретный кусок кода c и не могу понять, как. Мой проект стал целым кладбищем с комментариями. Я бы дал что-нибудь для ответа. Пожалуйста, помогите мне.

Что я хочу: Мой ViewController имеет gestureRecognizer, что дает мне значение, например. var fingerPos текущей позиции пальца. Простой пример:

 @objc func panGestureRecognizerHandler(_ sender: UIPanGestureRecognizer) {
        fingerPos = sender.location(in: view?.window)
}

Я хочу получить позицию fingerPos и передать ее TabBarController. Затем это значение следует использовать для перемещения TabBarController. Например self.view.frame.origin.y = fingerPos.y. Перемещение / обновление значения должно быть непрерывным.

То, что я пробовал: NSNotificationCenter, didSet, Structs в сочетании с didSet, Различные типы передачи функций например,

//Function in ViewController

func IBegYouGiveMeTheValueFunction() -> CGFloat {
 return fingerPos
}


//In the TabBarController

let vc = ViewController()
self.view.frame.origin.y = vc.IBegYouGiveMeTheValueFunction()

, что привело к сбоям, поскольку "Значение было найдено, ноль", даже если оно имело значение, добавив TabBarController как дочерний элемент, что привело к появлению белого экрана на симуляторе и вращению вентилятора , Значения записаны из любых классов (publi c), Попытка установить положение TabBarController в ViewController, буквально все, что я нашел в Интернете.

Может кто-нибудь помочь мне с этим? Я был бы очень благодарен!

1 Ответ

0 голосов
/ 31 января 2020

Вам не нужен пользовательский класс TabBarController.

Доступ к контроллерам представления на каждой вкладке можно получить через массив контроллеров панели вкладок .viewControllers, поэтому вы можете напрямую вызывать фонды или устанавливать свойства.

  • В вашем первом контроллере вида вкладок отслеживайте положение пальца с помощью жеста перетаскивания.
  • Когда он изменится, получите ссылку на контроллер вида во второй вкладке.
  • Вызовите забавное значение c в этом v c, которое, например, обновит позицию подпредставления.

Вот полный и простой пример. Просто добавьте UITabBarController в раскадровку и назначьте класс двух контроллеров вкладок по умолчанию для MyFirstViewController и MySecondViewController, включенных в следующий код (вам больше ничего не нужно добавлять ... нет IBOutlet или IBAction необходимо):

class MyFirstViewController: UIViewController {

    let statusLabel: UILabel = {
        let v = UILabel()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.backgroundColor = .red
        v.textColor = .white
        v.textAlignment = .center
        v.numberOfLines = 0
        v.text = "Tracking" + "\n\n" + "Drag your finger in view..."
        return v
    }()

    var topConstraint: NSLayoutConstraint!

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(statusLabel)

        topConstraint = statusLabel.topAnchor.constraint(equalTo: view.topAnchor, constant: 200.0)

        NSLayoutConstraint.activate([
            topConstraint,
            statusLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            statusLabel.widthAnchor.constraint(equalToConstant: 240.0),
        ])

        let pg = UIPanGestureRecognizer(target: self, action: #selector(panGestureRecognizerHandler(_:)))
        view.addGestureRecognizer(pg)

    }

    @objc func panGestureRecognizerHandler(_ sender: UIPanGestureRecognizer) {

        let fingerPos = sender.location(in: view)
        var strTmp = "Tracking Y: \(fingerPos.y)"
        topConstraint.constant = fingerPos.y

        guard let tb = self.tabBarController else {
            strTmp += "\n\n" + "Must be in a tabBarController!"
            statusLabel.text = strTmp
            return
        }

        guard let vControllers = tb.viewControllers else {
            strTmp += "\n\n" + "Could not get viewControllers from tabBarController!"
            statusLabel.text = strTmp
            return
        }

        guard vControllers.count > 1, let secondVC = vControllers[1] as? MySecondViewController else {
            strTmp += "\n\n" + "VC in second tab is not MySecondViewController!"
            statusLabel.text = strTmp
            return
        }

        // in case we have not yet navigated to the second tab
        secondVC.loadViewIfNeeded()

        // tell SecondVC to update the Y position
        secondVC.updateYPosition(at: fingerPos.y)

        strTmp += "\n\n" + "Sent!"

        statusLabel.text = strTmp

    }

}

class MySecondViewController: UIViewController {

    let statusLabel: UILabel = {
        let v = UILabel()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.backgroundColor = .blue
        v.textColor = .white
        v.textAlignment = .center
        v.numberOfLines = 0
        v.text = "Have not received" + "\n\n" + "a Y update yet..."
        return v
    }()

    var topConstraint: NSLayoutConstraint!

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(statusLabel)

        topConstraint = statusLabel.topAnchor.constraint(equalTo: view.topAnchor, constant: 200.0)

        NSLayoutConstraint.activate([
            topConstraint,
            statusLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            statusLabel.widthAnchor.constraint(equalToConstant: 240.0),
        ])

    }

    func updateYPosition(at y: CGFloat) -> Void {
        topConstraint.constant = y
        statusLabel.text = "Top contstraint constant:" + "\n\n" + "\(y)"
    }

}

Когда вы запускаете это, первое, что вы видите, это первая вкладка:

enter image description here

При нажатии и перетаскивании пальца верхняя часть красной метки будет выглядеть следующим образом:

enter image description here

При выборе второй вкладки вы появится синяя метка с верхом в том же положении Y, куда вы перетаскивали красную метку:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...