У меня есть пользовательский UITabbar , который выглядит следующим образом, если я использую его с раскадровками :
Однако, если я пытаюсь использовать это программно, все ломается / не отображается правильно. Чтобы использовать пользовательскую панель вкладок в моем программно созданном 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 элементов:
Ошибка ограничения
Кроме того, если я попытаюсь добавить кнопку в представление и ограничить ее нижнюю привязку к нижней привязке панели вкладок Я получаю сообщение об ошибке:
"... потому что у них нет общего предка. Есть ли ограничение или его
привязывает ссылочные элементы в разных иерархиях представления? Это
незаконный ".
Буду признателен за любую помощь!