iOS中的动态类型,用于交互式元素

时间:2016-11-30 17:08:40

标签: ios button fonts accessibility

我目前正在实施支持动态字体大小(用于辅助功能)的iOS应用程序。我阅读了Apple关于此事的文档[1],并说明了以下内容:

  

使用文本样式常量返回的字体用于表示   应用程序中的所有文本,而不是用户界面元素中的文本,例如   按钮,条形图和标签。

为什么?调整应用程序中的按钮等元素并不是特别重要,因为那些是用户与应用程序交互的部分吗?当用户将动态类型字体大小设置为非常大时,这会变得更糟,因为像按钮这样的元素更难以看到,因为其他所有内容变得更大,但按钮保持15pt字体大小。

我感兴趣的是:这背后的原因是什么?像按钮这样的元素是否只保留默认字体大小,其他人如何处理? 另外,我不清楚究竟应该是什么样的动态和什么不是 - 文本字段,文本字段的标签或解释性文本(标签)怎么样?

[1] https://developer.apple.com/library/content/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/CustomTextProcessing/CustomTextProcessing.html

2 个答案:

答案 0 :(得分:1)

Apple文档面对W3C WCAG 2.0 AA 1.4.4调整大小文本要求,表明"除了文字的标题和图像外,文本可以在没有辅助技术的情况下调整大小200%而不会丢失内容或功能。 (AA级)" (https://www.w3.org/TR/2008/REC-WCAG20-20081211/#visual-audio-contrast-scale

在界面元素中解决动态字体大小是正确的。我会忽视Apple的文档。

答案 1 :(得分:0)

您需要继承或扩展UIButton,然后将Label添加为子视图。

class DynamicTextButton : UIButton{


var dynamicTextLabel: UILabel!

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

    setDynamicTextLabelAndConstraints()

    self.heightAnchor.constraint(greaterThanOrEqualToConstant: 0.0)
    self.adjustsImageSizeForAccessibilityContentSizeCategory = true
    self.backgroundColor = ButtonStyle.TextButtonColor_Background

}


required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}


private func setDynamicTextLabelAndConstraints(){

    dynamicTextLabel = UILabel(frame: frame)
    dynamicTextLabel.font = ButtonStyle.TextButtonFont
    dynamicTextLabel.translatesAutoresizingMaskIntoConstraints = false
    dynamicTextLabel.font = UIFont.preferredFont(forTextStyle: .body)
    //self.textColor = TextStyle.MainTextColor_Normal
    dynamicTextLabel.adjustsFontForContentSizeCategory = true
    dynamicTextLabel.numberOfLines = 0
    dynamicTextLabel.lineBreakMode = NSLineBreakMode.byWordWrapping
    dynamicTextLabel.heightAnchor.constraint(greaterThanOrEqualToConstant: 0.0)


    self.addSubview(dynamicTextLabel)

    dynamicTextLabel.topAnchor.constraint(equalTo: self.topAnchor, constant:  0.0).isActive = true
    dynamicTextLabel.leftAnchor.constraint(equalTo: self.leftAnchor, constant:  0.0).isActive = true
    dynamicTextLabel.rightAnchor.constraint(equalTo: self.rightAnchor, constant:  0.0).isActive = true
    dynamicTextLabel.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant:  0.0).isActive = true

}

}

要使用:

    var myDynamicButton = DynamicTextButton(frame: frame)
    myDynamicButton.dynamicTextLabel.text = "My Button Title"
    myDynamicButton?.translatesAutoresizingMaskIntoConstraints = false