[iOS14] ScrollViewReader를 사용하여 간단한 채팅 구현
                                            
                                                
                                                
                                                
                                                
                                                
                                                 9640 단어  ScrollViewReaderiOSSwiftUIiOS14
                    
지금까지 채팅 구현의 어려움과 iOS14의 접근 방식
UIKit에서 채팅 앱을 구현할 때 UITableView를 사용하는 경우가 많다고 생각합니다.
LINE과 같은 채팅의 경우는 특히
高さの計算 , 一番下へスクロール 의 구현이 어렵네요.지금까지의 경험에 의해, 구현도 복잡해져 버그도 많기도 했습니다.
iOS14 가 되고 나서는, SwiftUI의 ScrollViewReader 가 나오고, 대개 채팅의 구현이 편해졌습니다.환경
ScrollViewReader란?
프로그래밍 방식으로 스크롤할 수 있습니다.
ScrollViewReader - Apple 공식 문서
ScrollView {
  ScrollViewReader { (proxy: ScrollViewProxy) in
    ...
  }
}
ScrollViewReader의 클로저에서
ScrollViewProxy에 액세스 할 수 있습니다. 이것을 저장하고,scrollTo 에서 프로그래밍 방식으로 스크롤합니다.
func scrollTo<ID>(_ id: ID, anchor: UnitPoint? = nil) where ID : Hashable
간단한 채팅으로 사용해 보았습니다.
struct ContentView: View {
    @ObservedObject private var viewModel: ViewModel = .init()
    @State var text: String = ""
    @State var value: ScrollViewProxy?
    var body: some View {
        VStack {            
            ScrollView {
                ScrollViewReader { value in
                    LazyVStack(alignment: .center, spacing: 16) {
                        //チャットの表示
                        ForEach.init(self.viewModel.messages, id: \.id) { message in
                            ChatView.init(message: message)
                        }
                    }.onAppear {
                        self.value = value //ScrollViewProxyを保存する
                        self.value?.scrollTo(self.viewModel.messages.count, anchor: .bottom) //初めに表示された時に一番下までスクロールする
                    }.animation(.easeInOut)
                }
            }
            //テキスト入力欄
            VStack {
                ...
            }.background(Color(white: 0.95))
        }
    }
}
extension ContentView {
    //送信ボタンを押した時
    func sendText() {
        viewModel.send(text: text)
        text = ""
        guard let message = viewModel.messages.last else { return }
        debugPrint(message)
        //わずかにタイミングをずらさないと、スクロールできない
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.1, execute: {
            withAnimation {
                //一番下にアニメーションする
                self.value?.scrollTo(message.id, anchor: .bottom)
            }
        })
    }
}
스쿠쇼

소스 코드
참고
htps : //로 ゔぇぺぺr. 아 ぇ. 코 m / 도쿠 멘 타치 온 / 슈 f 타이 / sc 로트 l ゔ ぃ
htps : // 이 m / 굉장한 / ms / 38b9f0135 a 12bfd49c
htps : // 메이 m. 코 m / 베테 rp 로 g 라민 g / 뵈 ld 아 짱 t 아 p 엔 r
htps : //로 ゔぇぺぺr. 아 ぇ. 코 m / 쓰리 아 ls / 수프 f 츠 / 아니 마친 g
htps //w w. 라 y 으아니 rぃ ch. 코 m / 5815412
Reference
이 문제에 관하여([iOS14] ScrollViewReader를 사용하여 간단한 채팅 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/usk2000/items/aa62f662e65e6935465c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)