Хотя в целом это работает нормально, некоторые пользователи сообщали о проблемах при использовании функций специальных возможностей: Настройки 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
Мобильная версия