просмотреть проблему отображения с iOS - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть этот интерфейс с пользовательскими вкладками.

это конечный результат

tableView с вкладками

tableView with tabs

всякий раз, когда я добавляю пользовательский радиус и границы, вид не отображается.Тем не менее, я вижу, что вкладки добавляются в просмотр стека с помощью инспектора пользовательского интерфейса.

Я использовал:

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 работает, то есть представление здесь, но просто нет

Есть идеи, что может вызвать это?это проблема для отладки

...