Поддерживает ли SwiftUI альтернативные макеты по предпочитаемому размеру шрифта? - PullRequest
0 голосов
/ 04 октября 2019

В идеале, приложение для iOS использует размеры шрифта, которые соответствуют общесистемной настройке размера шрифта пользователя. Тема освещена в докладе WWDC от 2017 года под названием Создание приложений с динамическим типом .

В простых случаях вы устанавливаете шрифт UIView с использованием именованных стилей, таких как body, caption1, title, размер которых варьируется в зависимости от настроек пользователя.

В более сложных случаях вам нужно написать разные ограничения автоматического макета для разных размеров шрифта. Например, если размер шрифта больше, горизонтальные надписи могут оказаться вертикальными.

enter image description here

enter image description here

Для этой ситуации в докладе WWDC показан код, подобный следующему:

if traitCollection.preferredContentSizeCategory > .extraExtraLarge {
    NSLayoutConstraint.deactivate( horizontalConstraints )
    NSLayoutConstraint.activate( verticalConstraints )
} else {
    NSLayoutConstraint.deactivate( verticalConstraints )
    NSLayoutConstraint.activate( horizontalConstraints )
}

Что эквивалентно этому в SwiftUI?

1 Ответ

3 голосов
/ 04 октября 2019

Самое близкое, что я могу придумать, будет что-то вроде этого:

struct ContentView: View {

    @Environment(\.sizeCategory) var sizeCategory: ContentSizeCategory

    let largeSizeCategories: [ContentSizeCategory] = [.extraExtraLarge,
                                                      .extraExtraExtraLarge,
                                                      .accessibilityMedium,
                                                      .accessibilityLarge,
                                                      .accessibilityExtraLarge,
                                                      .accessibilityExtraExtraLarge,
                                                      .accessibilityExtraExtraExtraLarge]

    var body: some View {
        Group {
            if largeSizeCategories.contains(sizeCategory) {
                VStack {
                    Text("Pizza, bananas, donuts")
                    Text("Io, Europa, Ganymede")
                }
            } else {
                HStack {
                    Text("Pizza, bananas, donuts")
                    Text("Io, Europa, Ganymede")
                }
            }
        }
    }

}

Получите ContentSizeCategory из Environment и настройте ваш вид в зависимости от значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...