使用swift在scrollview内的stackview中更改uibutton中的标题

Posted

技术标签:

【中文标题】使用swift在scrollview内的stackview中更改uibutton中的标题【英文标题】:Changing title in uibutton in stackview inside scrollview using swift 【发布时间】:2021-02-11 13:38:22 【问题描述】:

请您帮我解释一下为什么按钮标题的填充不起作用?

我在下面的代码中更新了按钮的标题 n 次。按钮位于水平滚动视图内。在滚动视图里面我有一个堆栈视图。在滚动之外,我更新了标题,并且填充超出了我的控制范围。

问题如下:如果我为按钮提供了一个大标题,然后我更改为一个短标题,则填充不会按照我在下面的代码中确定的那样更新。

    private func setupActionButtons(index: Int = 0, title: String = "") 
    
    allButtons[index].layer.cornerRadius = allButtons[0].bounds.height/2
    allButtons[index].layer.borderWidth = 1
    allButtons[index].layer.borderColor = UIColor.borderShortcutButton.cgColor
    allButtons[index].setTitleColor(.psGreyValueLabelFilled, for: .normal)
    if title != "" 
        allButtons[index].setTitle(title, for: .normal)
    
    allButtons[index].titleEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    allButtons[index].contentEdgeInsets = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 15)
    allButtons[index].imageEdgeInsets = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 0)
    
    allButtons[index].imageView?.contentMode = .scaleAspectFit
    allButtons[index].setImage(uiImage, for: .normal)
    allButtons[index].semanticContentAttribute = UIApplication.shared.userInterfaceLayoutDirection == .rightToLeft ? .forceLeftToRight : .forceRightToLeft
    
    allButtons[index].titleLabel?.font = UIFont.systemFont(ofSize: buttonFontSize, weight: UIFont.Weight.semibold)
    
    allButtons[index].tag = index
    allButtons[index].addTarget(self, action: #selector(self.handleSelectOption(sender:)), for: .touchUpInside)
    

解释得更好:当我在 stackview 中为两个按钮添加宽度相似的标题,然后我将其中一个按钮的标题更改为更小的宽度时,另一个按钮的宽度更大,填充更大,并且其他我更改的排列正确。

【问题讨论】:

你试过 button.titleLabel 吗?.adjustsFontSizeToFitWidth = true ? 快速测试,我没有发现任何问题。您说“按钮位于水平滚动视图视图中。滚动视图内部我有一个堆栈视图。”您的意思是按钮是堆栈视图的排列子视图吗?如果是这样,您配置/约束stackView的方式有问题吗?您需要提供更多信息。 @StefanOvomate 你的建议没有解决 @DonMag 按钮排列在 stackview 内。我发现stackview配置没有问题。配置听起来正确。 @DonMag 我在答案末尾添加了更多描述 【参考方案1】:

问题是将堆栈视图的Distribution 设置为Fill Proportionally

将堆栈视图设置为Fill,问题就消失了。

附带说明:忘记你听说过Fill Proportionally ...这是堆栈视图中最容易被误解和误用的设置,除非你确切地知道它是如何工作的以及你想使用它的确切原因,否则你赢了'没有得到你想要的布局。

【讨论】:

以上是关于使用swift在scrollview内的stackview中更改uibutton中的标题的主要内容,如果未能解决你的问题,请参考以下文章

SWIFT - ScrollView 内的 WKWebView 中的 HTML 滚动事件

Swift/Xcode - 无法与 ScrollView 中的 View 内的文本框和按钮进行交互

Swift - UIScrollView 内的 UICollectionView - 自动布局

使用 AutoLayout 以编程方式将 UILabel 添加到 ScrollView (swift)

Scrollview中的两个动态Stack View

ScrollView 中的 IBOutlet 产生 nil