.accessibilityShowButtonShapes устарел. Как правильно обрабатывать конфликты с .glassEffect?IOS

Программируем под IOS
Ответить
Anonymous
 .accessibilityShowButtonShapes устарел. Как правильно обрабатывать конфликты с .glassEffect?

Сообщение Anonymous »

Мое приложение поддерживает iOS 16+. Чтобы поддерживать Glass в iOS 26, я создал несколько пользовательских модификаторов, чтобы добавлять Glass только тогда, когда оно доступно.
Хотя в целом это работает нормально, некоторые пользователи сообщали о проблемах при использовании функций специальных возможностей: Настройки iOS/Доступность/Отображение и размер текста/ Формы кнопок и Уменьшение прозрачности
Когда эти две функции включены, кнопки со стеклом отображаются сплошным цветом. белый фон. Это проблема, когда содержимое кнопки (текст, значок и т. д.) белое...
Мне удалось @Environment(\.accessibilityShowButtonShapes) использовать другой цвет содержимого кнопки при использовании этой функции. Однако это свойство устарело, и замены ему нет.
Итак, как мне правильно обрабатывать эту функцию, не зная, используется она или нет?
Изображение

На этом изображении показаны кнопки под iOS 18 (нет стекло) и iOS 26 (стекло доступно). С включенными специальными возможностями или без них.

Код:
struct GlassTest: View {
@Environment(\.accessibilityShowButtonShapes) var buttonShapes
@Namespace var namespace

var body: some View {
VStack {
HStack {
Button(action: { print("Hello World") }) {
Image(systemName: "star.fill")
.foregroundStyle(.white)
.padding(8)
}

Button(action: { print("Hello World") }) {
Image(systemName: "heart.fill")
.foregroundStyle(.white)
.padding(8)
}
}
.glass(.clear, padding: 8, unionId: 1, namespace: namespace)
.glassEffectContainer()

HStack {
Button(action: { print("Hello World") }) {
Image(systemName: "star.fill")
.foregroundStyle(.white)
.padding(8)
}
.glass(.clear, padding: 8)

Button(action: { print("Hello World") }) {
Image(systemName: "heart.fill")
.foregroundStyle(.white)
.padding(8)
}
.glass(.clear, padding: 8)
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
.background(.red)
}
}

#Preview {
GlassTest()
}

// ================================================================================================
// MARK: Glass Effect
// ================================================================================================
enum GlassType {
case clear
case regular

@available(iOS 26, *)
var glass: Glass {
switch self {
case .clear: return .clear
case .regular: return .regular
}
}
}

struct GlassButtonModifier: ViewModifier {
let padding: CGFloat
let unionId: Int?
let namespace: Namespace.ID?

func body(content: Content) -> some View {
if #available(iOS 26, *) {
content
.padding(padding)
.contentShape(Circle())
.buttonStyle(.glass)
.applyIf(unionId != nil && namespace != nil) { view in
view.glassEffectUnion(id: unionId!, namespace: namespace!)
}
} else {
content
}
}
}

struct GlassModifier: ViewModifier {
let glassType: GlassType
let padding: CGFloat
let interactive: Bool
let unionId: Int?
let namespace: Namespace.ID?

func body(content: Content) -> some View {
if #available(iOS 26, *) {
content
.padding(padding)
.glassEffect(interactive ? glassType.glass.interactive() : glassType.glass)
.applyIf(unionId != nil && namespace != nil) { view in
view.glassEffectUnion(id: unionId!, namespace: namespace!)
}
} else {
content
}
}
}

struct GlassEffectContainerMofifier: ViewModifier {
func body(content: Content) -> some View {
if #available(iOS 26, *) {
GlassEffectContainer {
content
}
} else {
content
}
}
}

extension View {
func glassEffectContainer() -> some View {
self.modifier(GlassEffectContainerMofifier())
}

func glassButton(padding: CGFloat = 0, unionId: Int? = nil, namespace: Namespace.ID? = nil) -> some View {
modifier(GlassButtonModifier(padding: padding, unionId: unionId, namespace: namespace))
}

func glass(_ glass: GlassType = .regular, padding: CGFloat = 12, interactive: Bool = true, unionId: Int? = nil, namespace: Namespace.ID? = nil) -> some View {
modifier(GlassModifier(glassType: glass, padding: padding, interactive: interactive, unionId: unionId, namespace: namespace))
}

func applyIf(_ condition: Bool, modifier: (Self) -> Content, orElse: ((Self) -> Content)? = nil) -> some View {
if condition {
return AnyView(modifier(self))
} else {
return AnyView(self)
}
}
}



Подробнее здесь: https://stackoverflow.com/questions/798 ... nflicts-wi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»