在 stackview 中隐藏按钮会破坏 tableview 中的布局

Hide button in stackview break the layout in tableview

我有一个 tableviewcell,它在 stackview 中有两个按钮。其中一个按钮名称是 topupButton,另一个是详细信息按钮。如果一个标志为真,则顶部按钮隐藏。您可以在下面找到代码。

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

当我隐藏充值按钮详细信息按钮时,应该会在堆栈视图中拉伸。但是在我的一个牢房中,它的尺寸不正确。当我进行可视化调试时,我看到按钮的框架是正确的,但背景没有穿过按钮。你可以看到下面的图片。

我已经尝试过 layoutsubviews、setneedsdisplay、layoutifneeded for cell、stackview 和按钮。没有改变。您还可以在下面找到我的堆栈视图配置。

根据您的评论,很明显 UIBeizerPath 的使用首先造成了问题。这是因为:

Auto-Layout works best with UIView. But layers don't auto-resize.

查看 this question & answer 了解更多关于上述内容的信息。


由于您可能会为按钮添加遮罩层,因此您需要找到添加遮罩层的理想方法。并根据this answer, the correct place would be 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
    }
}