iOS ๐ŸŽ/SwiftUI

[SwiftUI] bottom sheet ๋„์šฐ๊ธฐ

fram 2023. 8. 23. 00:03

bottom card view, botton sheet ๋“ฑ ์šฉ์–ด๊ฐ€ ๋งŽ์€๋ฐ modifier์˜ ์ด๋ฆ„์€ sheet์ž…๋‹ˆ๋‹ค

 

@State private var isShowingSheet: Bool = false

ํ™”๋ฉด์— sheet์œผ๋กœ ๋„์šธ view๋ฅผ ๋ณด์—ฌ์ค„์ง€ ์—ฌ๋ถ€๋ฅผ ์œ„ํ•ด State๋ฅผ ํ•˜๋‚˜ ์„ ์–ธํ•ด ์ค๋‹ˆ๋‹ค. 

false์ด๋ฉด ํ™”๋ฉด์— ๋ณด์ด์ง€ ์•Š๊ฒŒ ๋˜๊ณ , true์ด๋ฉด ํ•˜๋‹จ์— sheet ํ˜•ํƒœ๋กœ view๊ฐ€ ๋ณด์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

 

Button {
    isShowingSheet.toggle()
    print(isShowingSheet)
} label: {
    Text("๋ฐ”ํ…€์‹œํŠธ ๋„์šฐ๊ธฐ")
}

isShowingSheet ๊ฐ’์„ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•œ Button์„ ํ•˜๋‚˜ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด isShowingSheet ์„ ํ† ๊ธ€ํ•ด ์ค๋‹ˆ๋‹ค. 

 

.sheet(isPresented: $isShowingSheet, content: {
    HStack {
        Text("๋ฐ”ํ…€ ์‹œํŠธ ์ž…๋‹ˆ๋‹ค. ")
    }
})
  • contetn ๋‚ด๋ถ€์— View๋ฅผ ๋ฐฐ์น˜

 

  • isPresented ํŒŒ๋ผ๋ฏธํ„ฐ๋‚˜ ๋ฐ”์ธ๋”ฉ ๋˜์–ด ์žˆ๋Š”๋ฐ ๊ทธ ๋œป์€ ์ด ๊ฐ’์„ sheet์—์„œ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ
Button {
    isShowingSheet.toggle()
    print(isShowingSheet)
} label: {
    Text("๋ฐ”ํ…€์‹œํŠธ ๋„์šฐ๊ธฐ")
}
.sheet(isPresented: $isShowingSheet, content: {
    HStack {
        Text("๋ฐ”ํ…€ ์‹œํŠธ ์ž…๋‹ˆ๋‹ค. ")
    }
    .onDisappear(perform: {
        print(isShowingSheet)
    })
})
  • ๋ฒ„ํŠผ์ด ๋ˆŒ๋ฆด ๋•Œ ํŠธ๋ฆฌ๊ฑฐ ์—ญํ™œ์„ ํ•˜๋Š” isShowingSheet์˜ ๊ฐ’์„ ์ฐ์–ด๋ณด๋ฉด true
  • sheet์—์„œ ๋„์›Œ์ฃผ๋Š” view๊ฐ€ disappear ๋ ๋•Œ isShowingSheet์„ ์ฐ์œผ๋ฉด false ๊ฐ€๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ. 
  • ์ฆ‰ ํ™”๋ฉด์— sheet๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉด true๋กœ ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง€๋ฉด false๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ
  • ๋ฒ„ํŠผ ํด๋ฆญ์‹œ isShowingSheet.toggle() ๊ณผ isShowingSheet = true๊ฐ€ ๋™์ผํ•œ ์—ญํ™œ์„ ํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Œ
.sheet(isPresented: $isShowingSheet) {
    HStack {
        Text("๋ฐ”ํ…€ ์‹œํŠธ ์ž…๋‹ˆ๋‹ค. ")
    }
    .presentationDragIndicator(.visible)
}

  • content๋กœ ์ „๋‹ฌํ•˜๋Š” view์— presentationDragIndicator(.visible) modifier๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด sheet ์ƒ๋‹จ์— ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ

 

.sheet(isPresented: $isShowingSheet) {
    HStack {
        Text("๋ฐ”ํ…€ ์‹œํŠธ ์ž…๋‹ˆ๋‹ค. ")
    }
    .presentationDetents([.height(40), .large])
}
  • presentationDetents๋ฅผ ์ง€์ •ํ•˜๋ฉด sheet์˜ ๋†’์ด๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ
  • large == 100, medium == 50 ์œผ๋กœ ์ง€์ •๋˜๋ฉฐ .height๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ง€์ • ๋†’์ด๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ

  • ์Šค์™€์ดํ”„ ์ œ์Šค์ฒ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ง€์ •ํ•œ detent ๊ฐ’์œผ๋กœ sheet์˜ ๋†’์ด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ
  • ์ƒ๋‹จ ์˜ˆ์ œ์—์„œ๋Š” large์ผ๋•Œ ์‚ด์ง ์•„๋ž˜๋กœ ์Šค์™€์ดํ”„ ํ•˜๋ฉด ๋†’์ด 40์œผ๋กœ ์—ฌ๊ธฐ์„œ ๋” ์•„๋ž˜๋กœ ์Šค์™€์ดํ”„ ํ•˜๋ฉด sheet์ด ์™„์ „ํžˆ ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง

Pexels์—์„œ Cojanu Alexandru๋‹˜์˜ ์‚ฌ์ง„: https://www.pexels.com/ko-kr/photo/17841512/