UIButton 框架不会随着使用 Swift 5 的可访问性大字体而增加

Posted

技术标签:

【中文标题】UIButton 框架不会随着使用 Swift 5 的可访问性大字体而增加【英文标题】:UIButton frame does not increase with accessibility large font using Swift 5 【发布时间】:2019-12-26 11:10:43 【问题描述】:

UIButton 标题(.body 或 .headline)的大辅助字体大小不会增加按钮的框架,只会增加标题文本。在下面的截图中可以清楚地看到:

约束只有顶部,前导和尾随,在代码中我也添加了 2 行:

button.adjustsImageSizeForAccessibilityContentSizeCategory = true
button.titleLabel?.numberOfLines = 0

黄色背景色是按钮的颜色,因此标识只有可点击的区域是黄色区域。我想增加按钮框架,使整个文本区域变得可点击。

【问题讨论】:

【参考方案1】:

一开始就存在多行按钮标签的问题 - 我认为这与使用无障碍字体没有直接关系。

尝试使用这个按钮子类:

class MultilineTitleButton: UIButton 

    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
        commonInit()
    

    override init(frame: CGRect) 
        super.init(frame: frame)
        commonInit()
    

    func commonInit() -> Void 
        self.titleLabel?.numberOfLines = 0
        self.titleLabel?.textAlignment = .center
        self.setContentHuggingPriority(UILayoutPriority.defaultLow + 1, for: .vertical)
        self.setContentHuggingPriority(UILayoutPriority.defaultLow + 1, for: .horizontal)
    

    override var intrinsicContentSize: CGSize 
        let size = self.titleLabel!.intrinsicContentSize
        return CGSize(width: size.width + contentEdgeInsets.left + contentEdgeInsets.right, height: size.height + contentEdgeInsets.top + contentEdgeInsets.bottom)
    

    override func layoutSubviews() 
        super.layoutSubviews()
        titleLabel?.preferredMaxLayoutWidth = self.titleLabel!.frame.size.width
    

它设置 titleLable 的 .numberOfLines = 0.textAlignment = .center 和拥抱优先级,然后覆盖 intrinsicContentSize 以告诉自动布局正确的 titleLabel 大小。

【讨论】:

“intrinsicContentSize 与 AutoLayouts 不兼容” -- 嗯?大部分自动布局是基于intrinsicContentSize。这就是为什么你很少给UILabel(甚至/尤其是多行标签)或UIButtonUISliderUISwitch等提供高度限制。【参考方案2】:

可能的解决方案是:

button.titleLabel?.numberOfLines = 0
button.titleLabel?.lineBreakMode = .byWordWrapping
button.titleLabel?.masksToBounds = true
button.sizeToFit()

【讨论】:

感谢您的回复,但已经尝试过使用这些台词,但对我没有任何效果。 您可以将按钮的高度限制设置为大于或等于标准值(例如:heightconstraint >= 35) 也试过了,我认为问题出在无障碍字体上……其他字体似乎也能正常工作。

以上是关于UIButton 框架不会随着使用 Swift 5 的可访问性大字体而增加的主要内容,如果未能解决你的问题,请参考以下文章

UIButton 未使用 Swift 在 UIView 中显示

将 UIButton 添加到工具栏 swift 5

UIButton不在两个图像之间切换Swift 4.2

Swift:UILabel 上的 UIButton

swift 设置UIbutton图片文字位置布局

UIButton 永远不会在 UIImageView 的框架区域内响应