Добавление кнопки действия с плавающей точкой к контроллеру вида внутри контроллера панели вкладок - PullRequest
0 голосов
/ 22 октября 2018

Я использую пользовательскую кнопку с плавающим действием ( Floaty ), которую я хочу программно добавить в мой UITableViewController, который находится внутри UITabBarController.Проблема в том, что нижняя панель вкладок накладывается поверх кнопки плавающего действия.

Внутри моего контроллера табличного представления:

let floaty = Floaty()
...
self.view.addSubview(floaty)
// also tried: self.tabBarController?.view.addSubview(floaty)

Я попытался установить поля следующим образом:

floaty.layoutMargins = UIEdgeInsets(top: 0, left: 0, bottom: 60, right: 0)
floaty.layoutIfNeeded()
self.view.layoutIfNeeded()

Но это не работает.

enter image description here

Как правильно разместить кнопку в контроллере табличного представления?Или, по крайней мере, как программно установить нижнее поле?

РЕДАКТИРОВАТЬ:

Также пробовал

self.navigationController?.view.addSubview(floaty)

И сначала он добавляеткнопка правильно, но когда я переключаю вкладки, он возвращается в положение, в котором накладывается нижняя полоса.Здесь:

enter image description here enter image description here

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

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

self.view.addSubview(floaty)

Поэтому, конечно, панель вкладок всегда будет стоять над контроллером вида, который вы добавиликнопка как вспомогательный вид.Посмотрите на рисунок 2 в документации UITabBarController

0 голосов
/ 24 октября 2018

Эта строка кода решит проблему с заполнением:

floaty.paddingY += tabBarController!.tabBar.frame.size.height

Если вы хотите, чтобы fab был глобальным для всех ваших вкладок, вы должны добавить его следующим образом:

tabBarController!.view.addSubview(floaty)

В противном случае, если вы добавите его в navigationController, и я предполагаю, что у вас есть разные для каждой вкладки, он будет существовать только в viewControllers этого navigationController.То же самое происходит, если вы добавляете его в self.view, потому что он будет существовать только в этом контроллере представления.

Также, если вы хотите скрыть / показать fab в некоторых определенных контроллерах представления, вы должны использовать комбинациюиз viewWillAppear/viewDidAppear/viewWillDisappear/viewDidDisappear методов как здесь:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    floaty.isHidden = false
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    floaty.isHidden = true
}

Удачи!

0 голосов
/ 22 октября 2018

вы не должны реализовывать это в вашем tableView, вы должны добавить его в свои homeTabs, где вы реализовали свои вкладки, вы не можете ни добавить его, добавив в качестве IBOutlet, либо просто объявить его как кнопку, вот мой код (у меня естьплавающая кнопка на моей вкладке "Конкурсы")

  @IBOutlet weak var leaderBoardBtn: UIButton!

// добавляем ограничения верхний верхний ведущий-трейлинг для кнопки ur *

  @IBOutlet weak var leadBottom: NSLayoutConstraint!  

/// это заставляет мою кнопку плавать // это ограничение нижней части моей кнопки к superView.bottom

, а затем в viewDidLoad:

  NotificationCenter.default.addObserver(self, selector: #selector(leadAnime(_:)),name:NSNotification.Name(rawValue: "animate"), object: nil)

, а затем в некоторых местах из viewDidLoad добавьте:

@objc func leadAnime(_ notification: NSNotification) {
        if let  count = notification.userInfo?["top"] as? Bool{
            if count{
                leadBottom.constant = 20
                UIView.animate(withDuration: 0.3, animations: {
                    self.view.layoutIfNeeded()
                })
            }else{
                leadBottom.constant = -100
                UIView.animate(withDuration: 0.3, animations: {
                    self.view.layoutIfNeeded()
                })
            }

        }
    }

Теперь в вашем контроллере табличного представления:

 var scrollS :CGFloat = 0
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "animate"), object: nil, userInfo: ["top":false])

}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
     NotificationCenter.default.post(name: NSNotification.Name(rawValue: "animate"), object: nil, userInfo: ["top":true]) }

   override func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if scrollS - scrollView.contentOffset.y < 0{
            NotificationCenter.default.post(name: NSNotification.Name(rawValue: "animate"), object: nil, userInfo: ["top":true])
        }else{
            if scrollS - scrollView.contentOffset.y > 0{
                NotificationCenter.default.post(name: NSNotification.Name(rawValue: "animate"), object: nil, userInfo: ["top":false])
            }
        }
        scrollS = scrollView.contentOffset.y

    }
    override func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        if scrollS - scrollView.contentOffset.y < 0{
            NotificationCenter.default.post(name: NSNotification.Name(rawValue: "animate"), object: nil, userInfo: ["top":true])
        }else{
            if scrollS - scrollView.contentOffset.y > 0{
                NotificationCenter.default.post(name: NSNotification.Name(rawValue: "animate"), object: nil, userInfo: ["top":false])
            }
        }
        scrollS = scrollView.contentOffset.y
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...