SwiftUI Странное пустое пространство внизу MessageView после навигации — как исправить?IOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 SwiftUI Странное пустое пространство внизу MessageView после навигации — как исправить?

Сообщение Anonymous »

Я столкнулся со странной проблемой в SwiftUI: появляется пустое пространство в нижней части представления. В частности, когда я перехожу к MessageView с помощью NavigationDestination, в нижней части экрана появляется неожиданный пробел. Однако когда приложение отправляется в фоновый режим, а затем возвращается на передний план, представление отображается правильно, без пробелов.
Шаги для воспроизведения:
  • Я перехожу к MessageView с помощью NavigationDestination. Экран
    показывает пустое пространство внизу, сдвигая MessageInputBar
    вверх.
  • Если я отправлю приложение в фоновый режим и затем откройте его снова, зазор

    исчезнет, ​​и вид будет выглядеть нормально, как и ожидалось.
Чего я хочу :
Я хотите устранить это странное пустое пространство и обеспечить, чтобы MessageInputBar всегда оставался в нормальном положении (аналогично тому, как он ведет себя в большинстве приложений чата).
Снимки экрана:
(Появляется пробел)
Изображение

Странный пробел исчезает после повторного открытия приложения из режима переднего плана
Изображение
(Странный пробел исчезает после повторного открытия приложения на переднем плане режим)
ChatsView.swift

Код: Выделить всё

struct ChatsView: View {
//Bla bla
.navigationDestination(isPresented: $isNavigatingToMessageView, destination: {
Group {
if let currentChatRoomId =  webSocketManager.currentChatRoomId {
MessageView(
webSocketManager: webSocketManager,
chatRoomId: currentChatRoomId
)
}
}})
}
Вот экран MessageView со странным пробелом
2- MessageView.swift

Код: Выделить всё

struct MessageView: View {
@Environment(\.colorScheme) var colorScheme
@Environment(\.dismiss) private var dismiss

@ObservedObject var webSocketManager: WebSocketManager
@ObservedObject private var messageViewModel: MessageViewModel

@State private var newMessage = ""
@State private var isNavigatingToProfileView: Bool = false
@State private var isKeyboardVisible: Bool = false
@State private var alertType: AlertType? = nil

let chatRoomId: String
let currentUserId = Auth.auth().currentUser?.uid

private var messages: [ChatMessage] {
guard let chatRoom = webSocketManager.chatRooms.first(where: { $0.id == chatRoomId }) else {
return []
}
return chatRoom.messages
}

init(webSocketManager: WebSocketManager, chatRoomId: String, isNavigatedFromProfile: Bool = false ) {
self.webSocketManager = webSocketManager
self.chatRoomId = chatRoomId
self.isNavigatedFromProfile = isNavigatedFromProfile

// Create a new instance of MessageViewModel for this specific chatroom
if let viewModel = webSocketManager.getMessageViewModel(for: chatRoomId) {
self._messageViewModel = ObservedObject(wrappedValue: viewModel)
} else {
self._messageViewModel = ObservedObject(wrappedValue: MessageViewModel())
}

print("MessageView init")
}

var body: some View {
GeometryReader { proxy in
VStack(spacing:0) {
ScrollViewReader { scrollView in
List {
ForEach(messages.reversed(), id: \.id) { message in

MessageBubble(message: message,
isLastMessage: isLastMessage(message: message)
)
.flippedUpsideDown()
.listRowSeparator(.hidden)
.listRowBackground(Color.clear)

.listRowInsets(EdgeInsets(top: 5, leading: 4, bottom: 5, trailing: 0))
.onAppear {
if message == messages.last && messageViewModel.hasMoreMessages && !messageViewModel.isLoadingMore && messageViewModel.initialLoadMessages{
loadMoreMessages()
}

// Send read receipt when the last message appears
if isLastMessage(message: message)
&& currentUserId != message.userId
&&  !message.isRead
{
sendReadReceipt(for: message.messageId)
}
}
.anchorPreference(
key:BoundsPreference.self,
value: .bounds,
transform: { anchor in
return [message.id.uuidString : anchor]
})
.onLongPressGesture {
withAnimation(.easeInOut) {
selectedMessage = message
}
}

}
}
.listStyle(.plain)
.flippedUpsideDown()
.scrollContentBackground(.hidden)
.onChange(of: messages.count) { _ in
if let lastMessage = messages.last {
withAnimation {
scrollView.scrollTo(lastMessage.id, anchor: .bottom)
}
}
}
.onAppear(perform: {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1, execute: {
self.messageViewModel.initialLoadMessages = true
})
})

}
.regainSwipeBack()
.onTapGesture {
if isKeyboardVisible {
// Dismiss the keyboard when tapped outside of the TextField
hiddenKeyboard()
}
}

MessageInputBar(message: $newMessage,
isKeyboardVisible: $isKeyboardVisible,
alertType: $alertType,
webSocketManager: webSocketManager ) {
sendMessage()
}

}
.onAppear {
setupRoomMessagesListener()

}
.onDisappear {
removeRoomMessagesListener()
}
.frame(height: proxy.size.height)
}

.navigationBarBackButtonHidden()
.navigationBarTitleDisplayMode(.inline)
.toolbar(content: {
ToolbarItem(placement: .topBarLeading) {
Button(action: {
dismiss()
if !isNavigatedFromProfile {
TabBarModifier.showTabBar()
}
}) {
Image(systemName: "chevron.left")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 13)
.foregroundStyle(.black.opacity(0.7))
}
}

ToolbarItem(placement: .principal) {
HStack {
VStack(alignment: .center ,spacing: 2) {
Button {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2, execute: {
withAnimation {
isNavigatingToProfileView = true
}

})
} label: {
Text(webSocketManager.currentOnlineRecipient?.name ?? "User")
.bold()
}
.buttonStyle(.plain)

}
}
}
})
}
Что я пробовал:
  • Я пробовал много способов исправить проблему, включая удаление многих
    компонентов, чтобы изолировать проблему. Я попытался поместить
    MessageInputBar в .bottomBar панели инструментов, но проблема с пробелами
    по-прежнему сохраняется.


Подробнее здесь: https://stackoverflow.com/questions/793 ... gation-how
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • SwiftUI TabView добавляет странное пустое пространство под видом?
    Anonymous » » в форуме IOS
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Почему при использовании координатораLayout внизу остается лишнее пустое пространство?
    Anonymous » » в форуме Android
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Пустое пространство внизу страницы после поворота устройства в iOS Safari
    Anonymous » » в форуме CSS
    0 Ответы
    33 Просмотры
    Последнее сообщение Anonymous
  • Пустое пространство внизу страницы после поворота устройства в iOS Safari
    Anonymous » » в форуме IOS
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Чрезмерное пустое пространство внизу в iOS с SafeAreaView и KeyboardAvoidingView
    Anonymous » » в форуме IOS
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous

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