У меня есть List
объекта, в NavigationView
. Если я размываю его, представление меняет смещение, кажется, что оно вызывает edgeIgnoringSafeArea при просмотре списка:
case 1: Если я размываю это, вид изменяет смещение.
case 2: Если я поставлю что-то перед List
в VStack
, смещение будет правильным (с пространством объекта)
вариант 3: Обходной путь, который я нашел, заключается в добавлении смещения y: 1 при эффекте размытия
struct Test: View {
@State private var arr = [1,2,3,4]
var body: some View {
TabView {
NavigationView {
HStack {
VStack {
List {
ForEach (arr, id:\.self) { _ in
Image(systemName: "person")
.resizable()
.frame(width: 150, height: 150)
}
}
}
VStack {
List {
ForEach (arr, id:\.self) { _ in
Image(systemName: "person")
.resizable()
.frame(width: 150, height: 150)
}
}
.blur(radius: 3)
}
}
.navigationBarTitle(Text("TITLE"), displayMode: .inline)
}
.navigationViewStyle(DoubleColumnNavigationViewStyle())//DoubleColumnNavigationViewStyle())
.tabItem {
Image(systemName: "message")
Text("LIST + LIST BLUR")
}
.tag(1)
NavigationView {
HStack {
VStack {
List {
ForEach (arr, id:\.self) { _ in
Image(systemName: "person")
.resizable()
.frame(width: 150, height: 150)
}
}
}
VStack {
Text("2").frame(width: 0, height: 0)
List {
ForEach (arr, id:\.self) { _ in
Image(systemName: "person")
.resizable()
.frame(width: 150, height: 150)
}
}
.blur(radius: 3)
}
}
.navigationBarTitle(Text("TITLE"), displayMode: .inline)
}
.tabItem {
VStack {
Image(systemName: "circle")
Text("LIST+VSTACKBLUR")
}
}
.tag(2)
NavigationView {
HStack {
VStack {
List {
ForEach (arr, id:\.self) { _ in
Image(systemName: "person")
.resizable()
.frame(width: 150, height: 150)
}
}
}
VStack {
List {
ForEach (arr, id:\.self) { _ in
Image(systemName: "person")
.resizable()
.frame(width: 150, height: 150)
}
}
.blur(radius: 3).offset(y:1)
}
}
.navigationBarTitle(Text("TITLE"), displayMode: .inline)
}
.tabItem {
VStack {
Image(systemName: "circle")
Text("List+BLUR+OFFSET")
}
}
}
}
}
struct Test_Previews: PreviewProvider {
static var previews: some View {
Test()
}
}
ОБНОВЛЕНИЕ: Я не могу размыть внутри списка, потому что я использую расширение View для отображения личного TextFieldAlert
extension View {
func textFieldAlert(isShowing: Binding<Bool>,
text: Binding<String>,
title: String, grayText: String, onReturnPressed: @escaping () -> Void) -> some View {
TextFieldAlert(isShowing: isShowing,
text: text,
presenting: { self },
title: title, grayText: grayText, onReturnPressed:
onReturnPressed)
}
}
struct TextFieldAlert<Presenting>: View where Presenting: View {
@Binding var isShowing: Bool
@Binding var text: String
let presenting: () -> Presenting
let title: String
var grayText:String
let onReturnPressed: () -> Void
func returnFunction() {//quando l'utenti schiaccia ok o invio}
self.isShowing = false
self.onReturnPressed()
}
var body: some View {
GeometryReader { (deviceSize: GeometryProxy) in
ZStack {
if self.isShowing {
self.presenting()
.blur(radius: 3).offset(y:1) //I've added this
.disabled(self.isShowing)
}
else {
self.presenting()
.disabled(self.isShowing)
}
VStack {
Spacer()
.frame(height: 8)
Text(self.title)
Divider()
TextField(self.grayText, text: self.$text, onCommit: {
self.returnFunction()
})
Divider()
Spacer()
.frame(height: 10)
HStack {
Button(action: {
withAnimation {
self.returnFunction()
}
}) {
Text("OK")
.frame(width: 150, height: 30)
.background(Color.white)
//.foregroundColor(.white)
.cornerRadius(15)
}
}
}
.padding()
.background(Color.white)
.clipShape(RoundedRectangle(cornerRadius: 15))
.frame(
width: 250,//deviceSize.size.width*0.6,
height: 220//deviceSize.size.height*0.6
)
.offset(y: -100)
.shadow(radius: 20)
.opacity(self.isShowing ? 1 : 0)
ZStack {
Circle().frame(width: 40, height: 40)
.foregroundColor(Color.white)
Image(systemName: "pencil.circle.fill")
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: 50, height: 50)
.clipShape(Circle())
.foregroundColor(Color.blue)
}
.offset(x:0, y: -220/3 - 110)//-deviceSize.size.height*0.6/6 - 110)
.opacity(self.isShowing ? 1 : 0)
}
}
}
}