Код: Выделить всё
// ChatApp.swift
import SwiftUI
import ExyteChat
@main
struct ChatApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
struct ContentView: View {
var body: some View {
NavigationStack {
NavigationLink("Open Chat") {
ChatDetailView()
}
.navigationTitle("Home")
.padding()
}
}
}
struct CollapsibleHeaderView: View {
@Environment(\.colorScheme) private var cs
@State private var isCollapsed = true
var body: some View {
VStack(alignment: .leading, spacing: 12) {
HStack(alignment: .top, spacing: 12) {
Image(systemName: "person.crop.circle")
.resizable()
.frame(width: 46, height: 46)
.foregroundColor(.blue)
VStack(alignment: .leading, spacing: 4) {
Text("John Doe")
.font(.headline)
.foregroundColor(.gray)
}
Spacer()
}
HStack {
Text("Sample Title Goes Here")
.font(.title3)
.fontWeight(.semibold)
.foregroundColor(cs == .dark ? .white : .primary)
Spacer()
Button {
withAnimation(.easeInOut) { isCollapsed.toggle() }
} label: {
Image(systemName: isCollapsed ? "chevron.down" : "chevron.up")
.imageScale(.medium)
.foregroundColor(cs == .dark ? .white : .primary)
}
.buttonStyle(.plain)
}
if !isCollapsed {
Text("Category: Demo")
.font(.subheadline)
.foregroundColor(.gray)
ScrollView(.horizontal, showsIndicators: false) {
HStack(spacing: 8) {
ForEach(0.. String {
switch self {
case .reply: return "Reply"
case .copy: return "Copy"
case .edit: return "Edit"
}
}
func icon() -> Image {
switch self {
case .reply: return Image(systemName: "arrowshape.turn.up.left")
case .copy: return Image(systemName: "doc.on.doc")
case .edit: return Image(systemName: "square.and.pencil")
}
}
static func menuItems(for message: ExyteChat.Message) -> [MessageAction] {
message.user.isCurrentUser ? [.reply, .copy, .edit] : [.reply, .copy]
}
}
var body: some View {
VStack(spacing: 0) {
CollapsibleHeaderView()
Divider()
ExyteChat.ChatView(
messages: messages,
chatType: .conversation,
replyMode: .quote
) { draft in
Task {
let msg = await ExyteChat.Message.makeMessage(
id: UUID().uuidString,
user: me,
status: .sent,
draft: draft
)
messages.append(msg)
}
}
messageMenuAction: { (action: MessageAction,
defaultActionClosure,
message) in
switch action {
case .reply:
defaultActionClosure(message, .reply)
case .copy:
defaultActionClosure(message, .copy)
case .edit:
defaultActionClosure(message, .edit { editedText in
if let idx = messages.firstIndex(where: { $0.id == message.id }) {
messages[idx].text = editedText
}
})
}
}
.frame(maxHeight: .infinity)
}
.navigationTitle("Chat Detail")
.navigationBarTitleDisplayMode(.inline)
}
}
Когда расширяется CollapsibleHeaderView '(isCollApsed = false), он нажимает на панели ввода чата вниз, и эта панель инструментов заканчивается за клавиатурой, что делает его жестким или невозможным. Требование 1
предотвратить расширение панели инструментов ввода, когда будет расширена за клавиатуру, когда клавиатура оставалась видимой. Сделайте пространство. < /p>
Убедитесь, что между нижней частью расширенного заголовка и входной панели существует как минимум 500px . Заголовок.>
Подробнее здесь: https://stackoverflow.com/questions/796 ... -exytechat