Как переопределить edgesIgnoringSafeArea (или любой модификатор представления)

#swift #swiftui #safearea

#swift #swiftui #safearea

Вопрос:

Я пытаюсь переопределить функциональность edgesIgnoringSafeArea(_:) , поскольку, на мой взгляд, у меня есть пользовательская обработка для вертикальной безопасной области. Однако для вызова super нет, поэтому я не уверен, как поступить, кроме обработки каждого края безопасной области. Любые советы будут оценены.

 // Will use later for custom handling of vertical safe area
@State private var edgesThatIgnoreSafeArea: Edge.Set = []

func edgesIgnoringSafeArea(_ edges: Edge.Set) -> some View {
    edgesThatIgnoreSafeArea = edges

    // There is no super here to call, and calling self would just call this function again
    return AnyView(edgesIgnoringSafeArea(edges.subtracting(.vertical)))  
}
 

Ответ №1:

Мы не можем переопределить модификаторы, но мы можем добавить наши собственные, которые используют стандарт, например

 extension View {
    func edgesIgnoringHorizontal(_ edges: Edge.Set) -> some View {
         self.edgesIgnoringSafeArea(edges.subtracting(.vertical))
    }
}
 

Примечание: хотя я не вижу в этом особого смысла overriding , потому что простое использование of .edgesIgnoringSafeArea(.horizontal) проще, более очевидно и читаемо… но в любом случае.

Комментарии:

1. Выяснил способ переопределения. Смотрите мой ответ.

Ответ №2:

Выяснил, как это сделать. Я обернул свой вид AnyView и применил к нему выборочную безопасную область.

 @State private var edgesThatIgnoreSafeArea: Edge.Set = []

func edgesIgnoringSafeArea(_ edges: Edge.Set) -> some View {
    edgesThatIgnoreSafeArea = edges

    return AnyView(self).edgesIgnoringSafeArea(edges.subtracting(.vertical))
}
 

Комментарии:

1. Определенно открыт для отзывов об этом ответе или других ответах, если у кого-то есть лучший подход.