ios UIStackView不考虑以编程方式添加的按钮的大小

yshpjwxd  于 2023-06-07  发布在  iOS
关注(0)|答案(2)|浏览(192)

我有一个UIStackView,它包含三个或四个定制的UIButton。所有按钮都是完全圆形的,左右按钮比中心的一/二略大。不知何故,我不能让UIStackView遵守DeckPageButton设置的边界。
下面是我的VC中呈现按钮的函数:

private func setupButtons() {
        guard let deck = self.deck else {
            log.error("Failed to load deck")
            return
        }
        
        let nFloat = CGFloat(deck.type.buttons.count)
        let rad = (deckButtonsStackView.bounds.size.width - (8.0 * (nFloat - 1.0))) / nFloat
        for type in deck.type.buttons {
            let button = DeckPageButton()
            button.setupView(type: type, size: CGSize(width: rad, height: rad))
            button.translatesAutoresizingMaskIntoConstraints = false
            deckButtonsStackView.addArrangedSubview(button)
        }
    }

下面是setupView函数:

func setupView(type: DeckPageButtonType, size: CGSize) {
        bounds.size = size.resized(multiplier: type.radiusCoefficient)
        layer.cornerRadius = size.height / 2
        layer.borderWidth = 5
        layer.borderColor = type.borderColor
    }

我为deckButtonsStackView尝试了不同的对齐和分布选项,但它们都不符合
1.按钮的纵横比-它们不是正方形,因此也不是圆形
1.边缘大小-所有按钮都是相同的大小,即使内部的按钮将其bounds设置为较小的比例
下面是我使用FillEqually得到的最佳结果(三个和四个按钮选项的代码相同):

我也试过设置按钮的frame而不是bounds,并保持其他一切相同,这是结果:

UIStackView对于我的目标来说只是一个糟糕的选择吗?如果是这样,什么是更好的方法?

2uluyalo

2uluyalo1#

您应该使用约束来设置每个按钮的大小:
setUpView中,而不是bounds.size = ...

let size = size.resized(multiplier: type.radiusCoefficient)
NSLayoutConstraint.activate([
    widthAnchor.constraint(equalToConstant: size.width),
    heightAnchor.constraint(equalToConstant: size.height)
])

之后,将间距设置为一些合理的值,对齐为“中心”,分布为“等中心”应该会给予你一个想要的结果。

aoyhnmkz

aoyhnmkz2#

不要为按钮设置'translatesAutoresizingMaskIntoConstraints = false',或者更好地使用约束而不是框架调整大小

相关问题