Кнопка «Скрыть» в просмотре стека ломает раскладку в представлении таблицы - PullRequest
0 голосов
/ 23 декабря 2019

У меня есть ячейка просмотра таблицы, в которой есть две кнопки внутри стека. Одно из названий кнопок - topupButton, а другое - кнопка подробностей. Верхняя кнопка скрыта, если установлен один флаг. Ниже вы можете найти код.

  self.topupButton.isHidden = self.selectedSim.operator_?.is_prepaid ?? false

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

Two button cell

What I want when hide the topupbutton

When I hide the button

Я пробовал макеты-представления, setneedsdisplay, layoutifneeds для ячейки, стека и кнопок. Ничего не изменилось. Вы также можете найти мою конфигурацию стека ниже:

Stackview config

Constraint of stackview

Constraint of stackview

Layout of cell

1 Ответ

1 голос
/ 23 декабря 2019

Что касается ваших комментариев, очевидно, что использование UIBeizerPath создало проблему в первую очередь. Это потому что:

Автоматическое расположение лучше всего работает с UIView. Но слои не меняются автоматически.

Посмотрите на этот вопрос и ответ , чтобы узнать больше о вышеуказанных строках.


Поскольку вы, скорее всего, добавляете слой маски к кнопкам, вам необходимо найти идеальный способ добавления этого слоя маски. И согласно этому ответу правильное место будет draw (_:) . Так что в основном вы будете делать что-то вроде ниже:

class TableViewCell: UITableViewCell {

    . . .

    override func draw(_ rect: CGRect) {
        super.draw(rect)
        topupButton.roundButton()
        detailsButton.roundButton()
    }

    . . .

}

// extension for rounding button with UIBezierPath
extension UIButton {
    func roundButton(){
        let size = CGSize(width: bounds.width / 2, height: bounds.width / 2)
        let maskPath = UIBezierPath(roundedRect: bounds,
                                    byRoundingCorners: .allCorners,
                                    cornerRadii: size)
        let maskLayer = CAShapeLayer()
        maskLayer.frame = bounds
        maskLayer.path = maskPath.cgPath
        layer.mask = maskLayer
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...