У меня есть этот интерфейс с пользовательскими вкладками.
это конечный результат
tableView с вкладками
всякий раз, когда я добавляю пользовательский радиус и границы, вид не отображается.Тем не менее, я вижу, что вкладки добавляются в просмотр стека с помощью инспектора пользовательского интерфейса.
Я использовал:
setNeedsDisplay()
layoutSubviews()
setNeedsLayout()
ничего не работает Есть идеи?
- это способ настройки представления и вкладок
Протокол RoundedTabsViewDelegate: class {func tabSelected (at index: Int) func roundCorner (выбранный: Bool)}
final class RoundedTabsView: UIView {
init(_ items: [String]) {
super.init(frame: .zero)
configure(with: items)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// MARK: Properties
weak var delegate: RoundedTabsViewDelegate?
private var items = [String]()
private var itemLabels = [UILabel]()
private var selectedItemIndex = 0
private var rect = UIView()
// MARK: UI
private let contentStackView = UIStackView()
private let tabSelectionMarkerView = UIView()
private func configure(with items: [String]) {
self.items = items
configureStackView()
}
private func configureStackView() {
addSubview(contentStackView)
itemLabels = items.enumerated().map { idx, item in
let label = UILabel()
label.text = item
label.font = UIFont.systemFont(ofSize: 20)
label.textAlignment = .center
label.isUserInteractionEnabled = true
label.tag = idx
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(itemLabelTap))
label.addGestureRecognizer(tapGesture)
return label
}
contentStackView.snp.makeConstraints { (make) in
make.edges.equalToSuperview()
}
contentStackView.axis = .horizontal
contentStackView.distribution = .fillEqually
itemLabels.forEach {
contentStackView.addArrangedSubview($0)
self.arrange(subView: itemLabels[selectedItemIndex], selected: selectedItemIndex == $0.tag)
$0.configure(index: selectedItemIndex)
$0.setNeedsLayout()
$0.setNeedsDisplay()
}
}
private func setupSelectionView() {
addSubview(tabSelectionMarkerView)
tabSelectionMarkerView.snp.makeConstraints { (make) in
make.edges.equalTo(itemLabels.first!.snp.edges)
}
sendSubview(toBack: tabSelectionMarkerView)
}
@objc private func itemLabelTap(_ tapGesture: UITapGestureRecognizer) {
if let view = tapGesture.view {
selectedItemIndex = view.tag
for label in itemLabels {
label.configure(index: selectedItemIndex)
self.arrange(subView: label, selected: selectedItemIndex == label.tag)
}
delegate?.tabSelected(at: selectedItemIndex)
//add radius on top left of topView if 1st tab is not selected
delegate?.roundCorner(selected: view.tag != 0)
}
}
}
- и, это viewController, где я инициализирую пользовательское представление:
Я вызываю этот метод в viewDidAppear
func setUpHeaderView() {
//segmented control will always be full width in cases when teh flexible header does not show
let segmentedWidth: CGFloat = shouldShowFlexibleHeader ? (view.frame.width - margins) / 2 : view.frame.width
//tableHeaderView
headerHeight = segmentedHeight + topViewHeight
headerView.frame = CGRect(x: 0, y: 1, width: view.frame.width, height: headerHeight)
tableView.tableHeaderView = headerView
tableView.tableHeaderView?.backgroundColor = Color.gray
//view
topView.frame = CGRect(x: 0, y: headerView.frame.height - topViewHeight, width: view.frame.width, height: topViewHeight)
topView.backgroundColor = .white
//segmented control - create custom view
let items = ["Derniers Documents", "Dernières activités"]
let segmentedControl = RoundedTabsView(items)
segmentedControl.frame = CGRect(x: 0, y: 01, width: segmentedWidth, height: segmentedHeight)
headerView.addSubview(topView)
headerView.addSubview(segmentedControl)
headerView.bringSubview(toFront: segmentedControl)
headerView.sendSubview(toBack: topView)
//delegate
segmentedControl.delegate = self
topView.addBordersToTopView()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
setupTableView()
setUpHeaderView()
if shouldShowFlexibleHeader {
if !isRegularConfigurationSetup {
configureFlexibleHeaderController()
}
tableView.contentInsetAdjustmentBehavior = .never
} else {
if !isCompactConfigurationSetup {
setupCompactConfiguration()
}
}
}
, пожалуйста, посмотрите демо здесь:
giphy.gif Как вы можете видеть, вкладки отображаются только когда я нажимаю на 1 вкладку.
UITapGestureRecognizer работает, то есть представление здесь, но просто нет
Есть идеи, что может вызвать это?это проблема для отладки