Apple Developer Documentation - ScrollViewReader
ScrollViewReader๋ ํ๋ก์๋ฅผ ์ด์ฉํด ์์ ๋ทฐ๋ก ์คํฌ๋กคํ๊ธฐ ์ํด ํ๋ก๊ทธ๋๋งคํฑํ ์คํฌ๋กค์ ์ ๊ณตํ๋ ๋ทฐ์ด๋ค. ์คํฌ๋กค๋ทฐ๋ฅผ ์คํฌ๋กค๋ฆฌ๋๋ก ๊ฐ์ผ๋ค.
ScrollViewReader { proxy in
ScrollView {
...
}
}
@Namespace๋ฅผ ์ด์ฉํด id๋ฅผ ๋ถ์ฌํ๋ค.
@Namespace var topID
@Namespace var bottomID
์คํฌ๋กค์ ์๋ถ๋ถ์๋ ๋ฐ์ ๊ฐ๋ฆฌํค๋ ํ์ดํ chevron ๋ฒํผ์ ๋ง๋ค์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฒํผ์ด ๋๋ฆฌ๋ฉด bottomId๋ฅผ ๊ฐ์ง ๋ทฐ๋ก ์คํฌ๋กคํ๊ฒ ํ์๋ค. ๋ฐ๋๋ก ์คํฌ๋กค์ ๋ฐ์๋ ํ๋จ ์คํฌ๋กค์ ์์น๊ฐ์ ์ป๊ธฐ ์ํด ๋น HStack์ ์ถ๊ฐํ์๋ค.
ScrollViewReader { proxy in
ScrollView {
Button(
action: { withAnimation { proxy.scrollTo(bottomID) } },
label: { Image(systemName: "chevron.down").foregroundColor(Color(.systemGray2)) })
.id(topID)
...
HStack {}.id(bottomID)
}
}
๋ฉ์ธ์ง๊ฐ ์์ฑ๋๋ฉด messageText์ ์ ์ฅ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๋ฉด ๋น ๋ฌธ์์ด์ด ๋๋๋ก ๋ฏธ๋ฆฌ ์ฝ๋๋ฅผ ์์ฑํ์๋ค.
@State private var messageText = ""
๋ฉ์ธ์ง ์ฒซ๊ธ์๋ฅผ ์ ๋ ฅํ์ ๋ messageText๋ ๋น ๋ฌธ์์ด์์ ๊ธธ์ด๊ฐ ์๋ ๋ฌธ์์ด๋ก ๋ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๋ฉด ๊ธธ์ด๊ฐ ์๋ ๋ฌธ์์ด์์ ๋น ๋ฌธ์์ด๋ก ๋ณํํ๋ค. ์ด ๋ณํ์ ๋ฐ๋ผ ์คํฌ๋กค์ ๋ฐ์ผ๋ก ๋ด๋ฆฌ๋ ์ ๋๋ฉ์ด์ ์ ์คํํ๋ค. onChange ํจ์๋ฅผ ์ฌ์ฉํ๊ณ , messageText == "" Bool๊ฐ ๋ณํ์ ๋ฐ๋ผ ์คํฌ๋กค์ ๋ด๋ฆฌ๋๋ก ํ์๋ค.
ScrollViewReader { proxy in
ScrollView {
Button(
action: { withAnimation { proxy.scrollTo(bottomID) } },
label: { Image(systemName: "chevron.down").foregroundColor(Color(.systemGray2)) })
.id(topID)
VStack(spacing: 16) {
ForEach(0..50) { _ in
Text("Scroll")
}
}
.onChange(of: messageText == "") { _ in
withAnimation { proxy.scrollTo(bottomID) }
}
HStack {}.id(bottomID)
}
}