web-dev-qa-db-ja.com

iOSストーリーボードのカスタムフォントで動的タイプのアクセシビリティサイズを尊重する方法

動的タイプのテキストスタイル 「タイトル1」を使用して、ストーリーボードのUILabelの組み込みフォントChalkboard SEにフォントフェースを設定するにはどうすればよいですか?

IOSのダイナミックタイプサイズを尊重する必要があります(AppleはiOS 7以降これを推奨していますか?)また、「テキストスタイル」フォントにデフォルトで使用されない組み込みフォントChalkboardSEを使用する必要があります。現在、画像に示されているカスタムフォントを使用していますが、ユーザーの動的タイプ/アクセシビリティサイズ設定に応じてフォントのサイズを変更する必要があります。 テキストスタイルフォントはそうです。最適なテキストスタイルオプションはタイトル1ですが、フォント/書体は使用できません。

Font menu in Xcode. Custom checked and Title 1 highlighted

13
timeSmith

Storyboardを使用してカスタムフォントと優先テキストスタイルの両方を指定することはできませんが、カスタムフォントの動的タイプサイズをプログラムで指定することは難しくありません。

スイフト:

let pointSize  = UIFontDescriptor.preferredFontDescriptorWithTextStyle(UIFont‌​TextStyleTitle1).poi‌​ntSize
let customFont = UIFont(name: "Chalkboard SE", size: pointSize)

UIContentSizeCategoryDidChangeNotificationを受け取ったら、同じコードを使用してラベルのフォントを更新します。

Obj C:

 CGFloat pointSize = [[UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleHeadline] pointSize];
 [titleLabel setFont:[UIFont fontWithName:@"Marker Felt" size:pointSize]];
21
user4151918

UILabel、UIButton、UITextField、UITextViewなど、iOS-11以降のカスタムフォントの動的フォントサイズを使用する必要がある関連UIFrameworkのすべての拡張機能を追加する必要があります。コードはSwift 4.2で与えられます。アプリで動的フォントの効果を確認するには、ネイティブiosクラスの代わりにこれらのカスタムクラスを使用する必要があります。

ここに最初はラベルです:

class AppLabel: UILabel {

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)
    if #available(iOS 11.0, *)  {

        self.font = UIFontMetrics.default.scaledFont(for: self.font)
        self.adjustsFontForContentSizeCategory = true
        // Fallback on earlier versions
    } else {
        // Fallback on earlier versions
    }
  }

}

ここで2番目はUIButtonです:

class AppButton: UIButton {

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)
    if #available(iOS 11.0, *) {

        self.titleLabel?.font = UIFontMetrics.default.scaledFont(for: self.titleLabel?.font ?? UIFont())
        self.titleLabel?.adjustsFontForContentSizeCategory = true
    } else {
        // Fallback on earlier versions 
    }
  }
}

ここで3番目はUITextFieldです:

class AppTextField: UITextField {
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)
    if #available(iOS 11.0, *) {

        self.font = UIFontMetrics.default.scaledFont(for: self.font ?? UIFont())
        self.adjustsFontForContentSizeCategory = true
    } else {
        // Fallback on earlier versions
    }
  }
}

UITextViewの最後のもの:

class AppTextView: UITextView {

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)
    if #available(iOS 11.0, *) {

        self.font = UIFontMetrics.default.scaledFont(for: self.font ?? UIFont())
        self.adjustsFontForContentSizeCategory = true
    } else {
        // Fallback on earlier versions
    }
  }
}
1
Umair Ali

NSNotification.Name.UIContentSizeCategoryDidChangeをリッスンする必要なしに私のソリューションを試してください。

UIViewまたはUITableViewCellでtraitCollectionDidChangeをオーバーライドし、同様のTextStyleでフォントサイズを更新/計算するだけです。

シミュレートされたデバイスとMacOSのアクセシビリティインスペクターで簡単にテストできます。

 override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
       super.traitCollectionDidChange(previousTraitCollection)

        let pointSize = UIFontDescriptor.preferredFontDescriptor(withTextStyle: .title1).pointSize
        titleLabel.font = titleLabel.font.withSize(pointSize)
    }
0
Peter Kreinz