Swift Custom UITabbar не отображается в CustomUITabBarController - PullRequest
0 голосов
/ 29 июня 2019

У меня есть пользовательский UITabbar , который выглядит следующим образом, если я использую его с раскадровками :

Custom Tabbar

Однако, если я пытаюсь использовать это программно, все ломается / не отображается правильно. Чтобы использовать пользовательскую панель вкладок в моем программно созданном TabbarController, мне пришлось переопределить переменную панели вкладок контроллера :

Вот какой у меня код

Код контроллера представления пользовательской вкладки (укороченный):

class MainTabBarController: CustomTabbarController {

    override func viewDidLoad() {
    super.viewDidLoad()

    tabBar.backgroundColor = .white
    tabBar.isTranslucent = false

    setupSubviews() // sets up the tabbar items
    setupConstraints() // tries to setup the button, specified at the end of this post
  }

    private func setupConstraints() { // setting those constraints causes the app to crash
    // specified at the end of this post
        actionButton.anchor(top: nil, left: nil, bottom: tabBar.safeAreaLayoutGuide.bottomAnchor, right: nil, paddingTop: 0, paddingLeft: 0, paddingBottom: 10, paddingRight: 0, width: Constants.actionButtonSize.width, height: Constants.actionButtonSize.height)
        actionButton.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
  }

}

Код пользовательского контроллера вкладок:

class CustomTabbarController: UITabBarController {
    let customTabBar = CustomTabbar()

    override var tabBar: UITabBar {
        return customTabBar
    }
}

Код пользовательской вкладки:

import UIKit
import Foundation

class CustomTabbar: UITabBar {

    private var shapeLayer: CALayer?

    override func draw(_ rect: CGRect) {
        self.addShape()
    }

    private func addShape(){
        let shapeLayer = CAShapeLayer()
        shapeLayer.path = createPath()
        shapeLayer.strokeColor = UIColor.lightGray.cgColor
        shapeLayer.fillColor = UIColor.white.cgColor
        shapeLayer.lineWidth = 1.0

        if let oldShapeLayer = self.shapeLayer {
            self.layer.replaceSublayer(oldShapeLayer, with: shapeLayer)
        } else {
            self.layer.insertSublayer(shapeLayer, at: 0)
        }
    }


    private func createPath() -> CGPath {

        let radius: CGFloat = 37.0
        let path = UIBezierPath()
        let centerWidth = self.frame.width / 2

        // path creation code removed (for clarity)

        return path.cgPath
    }
}

Что я получаю:

К сожалению, панель вкладок отображается неправильно и не отображает никаких элементов, хотя в ней будет отображаться 5 элементов:

Empty tabbar

Ошибка ограничения

Кроме того, если я попытаюсь добавить кнопку в представление и ограничить ее нижнюю привязку к нижней привязке панели вкладок Я получаю сообщение об ошибке:

"... потому что у них нет общего предка. Есть ли ограничение или его привязывает ссылочные элементы в разных иерархиях представления? Это незаконный ".

Буду признателен за любую помощь!

...