Coming soon - Get a detailed view of why an account is flagged as spam!
view details

This post has been de-listed

It is no longer included in search results and normal feeds (front page, hot posts, subreddit posts, etc). It remains visible only via the author's post history.

1
Issue with .ignoreSafeArea(.keyboard) Modifier
Post Flair (click to view more posts with a particular flair)
Post Body

I am currently trying to fix an issue in my chat view where when I tap on the TextField to type a comment, the entire view gets shifted upwards. While doing some digging, I saw that adding

.ignoreSafeArea(.keyboard)

was a popular fix, yet it doesn't work for me. I've tried adding it as a modifier to contentView in the body view, tried adding it to the ScrollViewReader, to all the VStacks and HStack, and nothing. The code associated with the view is as follows:

struct TakesChatView: View {
    
    @ObservedObject var viewModel: TakeCommentViewModel
    @FocusState var focus: Bool
    @State private var selectedMedia: [PhotosPickerItem] = []
    @State private var selectedImageData: [Data] = []
    @State private var selectedGIFData: [Data] = []
    @State private var selectedVideoData: [Data] = []
    
    var body: some View {
        contentView
            .navigationTitle(viewModel.take.title)
            .navigationBarTitleDisplayMode(.inline)
            .background(Color.containerBackground)
            .onChange(of: viewModel.focus) { focus in
                self.focus = focus
            }
            .onChange(of: selectedMedia) { _ in
                loadMedia()
            }
    }
    
    var contentView: some View {
        VStack {
            ScrollViewReader { scroll in
                ScrollView {
                    VStack(spacing: 12) {
                        ForEach(viewModel.comments, id: \.self) { comment in
                            TakeCommentView(
                                comment: comment,
                                viewModel: self.viewModel
                            )
                            .padding(.horizontal, 10)
                            .id(comment.documentID)
                        }
                    }
                    .onChange(of: viewModel.commentAdded) { id in
                        scroll.scrollTo(id, anchor: .bottom)
                        viewModel.commentAdded = nil
                    }
                }
                .scrollDismissesKeyboard(.immediately)
            }
            .ignoresSafeArea(.keyboard)
            
            VStack {
                if !selectedImageData.isEmpty {
                    ScrollView(.horizontal) {
                        HStack {
                            ForEach(Array(selectedImageData.enumerated()), id: \.element) { index, data in
                                ZStack(alignment: .topTrailing) {
                                    Image(uiImage: UIImage(data: data)!)
                                        .resizable()
                                        .scaledToFill()
                                        .frame(width: 200, height: 200)
                                        .clipped()
                                    
                                    Button(action: {
                                        selectedImageData.remove(at: index)
                                    }) {
                                        Image(systemName: "xmark.circle.fill")
                                            .foregroundColor(.white)
                                            .background(Color.black.opacity(0.6))
                                            .clipShape(Circle())
                                    }
                                    .padding(5)
                                }
                            }
                        }
                        .padding(.horizontal, 10)
                    }
                }
                
                if !selectedGIFData.isEmpty {
                    ScrollView(.horizontal) {
                        HStack {
                            ForEach(Array(selectedGIFData.enumerated()), id: \.element) { index, data in
                                ZStack(alignment: .topTrailing) {
                                    WebView(gifData: data)
                                        .frame(width: 200, height: 100)
                                    
                                    Button(action: {
                                        selectedGIFData.remove(at: index)
                                    }) {
                                        Image(systemName: "xmark.circle.fill")
                                            .foregroundColor(.white)
                                            .background(Color.black.opacity(0.6))
                                            .clipShape(Circle())
                                    }
                                    .padding(5)
                                }
                            }
                        }
                        .padding(.horizontal, 10)
                    }
                }
                
                if !selectedVideoData.isEmpty {
                    ScrollView(.horizontal) {
                        HStack {
                            ForEach(Array(selectedVideoData.enumerated()), id: \.element) { index, data in
                                ZStack(alignment: .topTrailing) {
                                    VideoPreviewPlayer(videoData: data)
                                    
                                    Button(action: {
                                        selectedVideoData.remove(at: index)
                                    }) {
                                        Image(systemName: "xmark.circle.fill")
                                            .foregroundColor(.white)
                                            .background(Color.black.opacity(0.6))
                                            .clipShape(Circle())
                                    }
                                    .padding(5)
                                }
                            }
                        }
                        .padding(.horizontal, 10)
                    }
                }
                
                LazyVStack(alignment: .leading) {
                    if viewModel.searchingUser {
                        ScrollView {
                            SearchUserView(text: $viewModel.searchText, user: $viewModel.mentionedUser, invert: true)
                                .padding(5)
                        }
                    }
                }
                
                HStack {
                    TextField("Type your comment", text: $viewModel.textToPost, axis: .vertical)
                        .keyboardType(.twitter)
                        .padding([.leading, .vertical], 6)
                        .focused($focus)
                        .onChange(of: viewModel.textToPost) { newValue in
                            if newValue.last == "@" {
                                withAnimation {
                                    viewModel.searchingUser = true
                                }
                            } else if newValue.last == " " {
                                withAnimation {
                                    viewModel.searchingUser = false
                                }
                            }
                            
                            if viewModel.searchingUser {
                                viewModel.searchText  = String(newValue.last ?? "a")
                            }
                        }
                    
                    
                    PhotosPicker(selection: $selectedMedia, matching: .any(of: [.images, .videos]), photoLibrary: .shared()) {
                        ComposeType.media.image
                            .frame(width: 40, height: 40, alignment: .center)
                    }
                    .onAppear {
                        selectedMedia.removeAll()
                        selectedImageData.removeAll()
                        selectedGIFData.removeAll()
                        selectedVideoData.removeAll()
                    }
                    
                    postButton
                }
                .border(.lightGray, width: 1, cornerRadius: 10)
                .padding([.bottom, .horizontal], 10)
            }
        }
    }
}

What am I missing to have the modifier work as intended so the view stops shifting upwards?

Edit: Simplified the code a bit to make it more readable and take less space.

Author
Account Strength
70%
Account Age
3 years
Verified Email
Yes
Verified Flair
No
Total Karma
1,783
Link Karma
236
Comment Karma
1,496
Profile updated: 5 days ago
Posts updated: 2 months ago

Subreddit

Post Details

We try to extract some basic information from the post title. This is not always successful or accurate, please use your best judgement and compare these values to the post title and body for confirmation.
Posted
3 months ago