Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Swift/SwiftUI

[SwiftUI] Modal View (๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ)

๊ฐ์ž ๐Ÿฅ” 2022. 4. 7. 20:25
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š”, ์˜ค๋žœ๋งŒ์— ๋Œ์•„์˜จ ๊ฐ์ž์ž…๋‹ˆ๋‹ค. ๋…ผ๊ฑด ์•„๋‹ˆ๊ตฌ,,, ์• ํ”Œ์•„์นด๋ฐ๋ฏธ์—์„œ ์—ด์‹ฌํžˆ ํ”„๋กœ์ ํŠธ ์ค‘์ธ๋ฐ, ๊ทธ๊ฑธ ๋ธ”๋กœ๊ทธ์— ์—…๋กœ๋“œ ํ•ด๋„ ๋œ๋‹ค๋Š” ํ—ˆ๋ฝ์ด ๋–จ์–ด์ง„๋‹ค๋ฉด, ์–ด๋–ค ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ๋Š”์ง€ ์ฐพ์•„์˜ฌ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ใ…Žใ…Ž 

ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ SwiftUI๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, ์ด๋•Œ ํ•„์š”ํ•œ ๊ฒƒ๋“ค์„ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ํฌ์ŠคํŒ…ํ•ด๋ณผ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค! ๊ทธ๋ž˜์„œ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ํฌ์ŠคํŒ…๋˜๋Š” ๊ธฐ๋ถ„์ด ์•„๋‹ˆ๋ผ, ๊ทธ๋•Œ๊ทธ๋•Œ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๊ณผ ๊ณต๋ถ€ํ•œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด์„œ ์—…๋กœ๋“œํ•œ๋‹ค~ ๋ผ๊ณ  ์ดํ•ดํ•ด์ฃผ์‹œ๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ใ…Žํ•˜ํ•˜

์˜ค๋Š˜์€ Modal View ์— ๋Œ€ํ•ด์„œ ํฌ์ŠคํŒ…ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ› ๏ธ Modal View ๋ž€?

iOS ๊ฐœ๋ฐœ์„ ์ค€๋น„ํ•˜๋ฉด์„œ ๋Š๋‚€์ ์€, ์• ํ”Œ์ด ์ œ์•ฝํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ๊ต‰์žฅํžˆ ๋งŽ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค! ์žฅ์ ์ด๋ฉด์„œ ๋‹จ์ ์ด๊ธฐ๋„ ํ•œ๋ฐ์š”, ์šฐ์„  ์• ํ”Œ์—์„œ ์ •์˜ํ•˜๋Š” Modal View ์—๋Œ€ํ•ด์„œ ์•Œ์•„๋ด…์‹œ๋‹ค.

์ฐธ๊ณ ) Apple Developer ๋ผ๋ฉด ๊ผญ ๋ด์•ผํ•  HIG (Human Interface Guidelines) - Modality

 

Modality - App Architecture - iOS - Human Interface Guidelines - Apple Developer

Modality Modality is a design technique that presents content in a temporary mode that requires an explicit action to exit. Presenting content modally can: Help people focus on a self-contained task or set of closely related options Ensure that people rece

developer.apple.com

 

๐Ÿ› ๏ธ Modality ์— ๋Œ€ํ•œ ์ •์˜

Modality is a design technique that presents content in a temporary mode that requires an explicit action to exit.

ํ•ด์„ํ•ด๋ณด์ž๋ฉด, Modailty๋Š” ๋””์ž์ธ ๊ธฐ์ˆ  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ปจํ…์ธ ๋ฅผ ์ข…๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด ๋ช…์‹œ์ ์ธ ์ž‘์—…์ด ํ•„์š”ํ•œ ์ž„์‹œ๋ชจ๋“œ๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒŒ ๋ฌด์Šจ.. ๋ง์ด์ง€..? ๊ทธ๋Ÿผ ๋‹ค์Œ ๊ทธ๋ฆผ์„ ๋ณด์ž. ์•„์ดํฐ์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์ด๋ผ๋ฉด, ํ•ด๋‹น view ์— ๋Œ€ํ•ด์„œ ์ต์ˆ™ํ• ๊ฒ๋‹ˆ๋‹ค. ์•„์ดํฐ ๊ธฐ๋ณธ์•ฑ "Mail"์„ ๋“ค์–ด๊ฐ€๋ณด๋ฉด, ๋ฉ”์ผ List ๊ฐ€ ์ญ‰ ๋œจ๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ "๋ฉ”์ผ์ž‘์„ฑ"๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋ด…์‹œ๋‹ค. ๊ทธ๋Ÿผ ๋ฐ‘์—์„œ ๋ฌด์Šจ View๊ฐ€ ํ•˜๋‚˜ ๋ถ• ํ•˜๊ณ  ์˜ฌ๋ผ์˜ต๋‹ˆ๋‹ค. ์ด๊ฒŒ ๋ฐ”๋กœ Modal view

[์ถœ์ฒ˜] https://developer.apple.com/design/human-interface-guidelines/ios/app-architecture/modality/

์ด์™ธ์—๋„ HIG์— ๋”ฐ๋ฅด๋ฉด, iOS๋Š” Modality๋กœ์„œ alerts, activity views, share sheets, action sheets ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ modality์— ๋Œ€ํ•œ ์„ค๋ช…๊ณผ ์ž์„ธํ•œ Guidelines๋Š” ์ถ”ํ›„ HIG ํฌ์ŠคํŒ…์„ ํ• ๋•Œ ์ž์„ธํžˆ ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜๊ณ , ์˜ค๋Š˜์€ Modal View๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด ๋ณผ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. 

 

๐Ÿ› ๏ธ SwiftUI ๋กœ Modal View ๊ตฌํ˜„ํ•˜๊ธฐ

  1. ์šฐ์„  'Body' ์— Text์™€ Button์„ ์ƒ์„ฑํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
  2. Button ๋‚ด๋ถ€์—๋Š” Action ๊ณผ Text ๋ถ€๋ถ„ ๋‘ ๊ฐœ๋กœ ๋‚˜๋‰˜์–ด์ง€๋Š”๋ฐ, Action ๋ถ€๋ถ„์—๋Š” Modal ์ฐฝ์ด ๋œจ๊ฒŒ ๋งŒ๋“ค์—ˆ๊ณ , Text ๋ถ€๋ถ„์—๋Š” ๋ฒ„ํŠผ ๋ชจ์–‘์— ๋Œ€ํ•œ ์†์„ฑ์„ ๋„ฃ์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
    1. Action ๋ถ€๋ถ„
      • showModal ์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ false ๋ผ๊ณ  ๋จผ์ € ์„ ์–ธํ•ด์ค๋‹ˆ๋‹ค. 
      • ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ true ๊ฐ€ ๋˜๋ฉด, modal ์ฐฝ์ด ๋ณด์—ฌ์ง‘๋‹ˆ๋‹ค.
      • action ๋ถ€๋ถ„์— showModal = true ๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด์„œ ๋ชจ๋‹ฌ์ฐฝ์ด ๋œจ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
    2. ๋ฒ„ํŠผ ์†์„ฑ๋ถ€๋ถ„
      • Button ๋ถ€๋ถ„์€ ๋”ฐ๋กœ ํฌ์ŠคํŒ… ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.
      • ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜์ž๋ฉด, Button ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ‹€์ด ์—†์ด text๋กœ๋งŒ ๋จผ์ € ์ œ๊ณต๋˜๊ธฐ ๋•Œ๋ฌธ์— frame ์†์„ฑ์„ ์ฃผ์–ด์„œ ๋ฒ„ํŠผ ํฌ๊ธฐ๋ฅผ ์ •ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
      • background ์†์„ฑ์„ ํ™œ์šฉํ•ด์„œ button ์˜ ๋ชจ์–‘์„ RoundedRectangle๋กœ ๋ฐ”๊พธ์–ด ์ฃผ์—ˆ๊ณ , ์ƒ‰์ƒ์„ ์น ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
        • primaryColor๋Š” ์ œ๊ฐ€ ์ž„์˜๋กœ ์ƒ์„ฑํ•œ ์ƒ‰์ด๊ธฐ ๋•Œ๋ฌธ์—, ํ•ด๋‹น ์ฝ”๋“œ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์›ํ•˜์‹œ๋Š” ๋ถ„๋“ค์€ Color.black ์œผ๋กœ ์ง„ํ–‰ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค!!
      • foregroundColor ์†์„ฑ์„ ์‚ฌ์šฉํ•ด์„œ ๊ธ€์ž ์ƒ‰์ƒ์„ white ๋กœ ๋ฐ”๊พธ์–ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
      • sheet ์†์„ฑ์„ ํ™œ์šฉํ•ด์„œ ModalView๋ฅผ sheet๋กœ ์ง€์ •ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. 
        • Modal View ๋Š” ์•„๋ž˜์—์„œ ๊ตฌ์กฐ์ฒด๋กœ ์ •์˜ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. 
import SwiftUI

struct TestView: View {
    @State private var showModal = false
    
    var body: some View {
        VStack{
            Text("'๋‚˜ํƒ€๋‚˜๋ผ'๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด ๋ชจ๋‹ฌ ์ถœ๋ ฅ!")
            Button(action: {
                self.showModal = true
            }){
                Text("๋‚˜ํƒ€๋‚˜๋ผ").bold()
            }
            .frame(width: 80, height: 30, alignment: .center)
            .background(RoundedRectangle(cornerRadius: 10).fill(Color.primaryColor))
            .font(.system(size: 16))
            .foregroundColor(Color.white)
            .sheet(isPresented: self.$showModal) {
                ModalView()
            } //Button ๋
        } //Vstack ๋
        
        
    }
}

 

3. Modal View ์‹œํŠธ๋ฅผ ๊ตฌ์„ฑํ•ด๋ด…์‹œ๋‹ค.

  • ๊ตฌ์กฐ์ฒด ModalView ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
  • @Environment ์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์—ฌ๊ธฐ ๋ฅผ ์ฝ์–ด๋ด…์‹œ๋‹ค.
  • ์•ž์—์„œ ๊ตฌ์„ฑํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•˜๊ฒŒ text์™€ button ์„ ๋„ฃ์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
  • @Environment ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜์—์„œ๋ถ€ํ„ฐ dismiss() (๋‹ซ๋Š”๊ฑฐ!!) ๋ฅผ ๋ฐ›์•„์™”์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ buttion์„ ๋ˆ„๋ฅด๋ฉด, dismiss ํ•ด์ฃผ๋Š” ๊ฒƒ์„ button์˜ action ๋ถ€๋ถ„์— ๋„ฃ์–ด์ค๋‹ˆ๋‹ค. (dismiss ๊ฐ€ ๋‹ซ๊ธฐ!)
struct ModalView: View {
    @Environment(\.presentationMode) var presentation
    
    var body: some View {
        VStack {
            Text("Modal view ๋“ฑ์žฅ")
            Button(action: {
                presentation.wrappedValue.dismiss()
            }) {
                Text("Modal view ๋‹ซ๊ธฐ").bold()
            }
            .frame(width: 150, height: 30, alignment: .center)
            .background(RoundedRectangle(cornerRadius: 40).fill(Color.subColor))
            .font(.system(size: 16))
            .foregroundColor(Color.white)
        }
    }
}

 

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ํ”„๋ฆฌ๋ทฐ๋กœ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค๊ณ ์š”??? ๊ทธ๋Ÿผ ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”!! ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋Š”๋ฐ๋„ ํ”„๋ฆฌ๋ทฐ๊ฐ€ ๋œจ์ง€ ์•Š๋Š”๋‹ค๋ฉด option + command + enter ๋ฅผ ๋ˆŒ๋Ÿฌ์ฃผ์„ธ์š”. (ํ”„๋ฆฌ๋ทฐ๊ฐ€ ๋‹ซํ˜€์žˆ๋Š”๊ฒ๋‹ˆ๋‹ค!)

struct ModalView_Previews: PreviewProvider {
    static var previews: some View {
        TestView()
    }
}

 

๐Ÿ› ๏ธ  Modal View ์™„์„ฑ๋ณธ ํ™•์ธํ•˜๊ธฐ

์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜๊ฒŒ SwiftUI ๋กœ Modal View ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋‹ค์–‘ํ•œ ํฌ์ŠคํŒ…์œผ๋กœ ์ฐพ์•„๋ต๊ฒŒ์š”!! ์ €์ฒ˜๋Ÿผ,,, ์Šค์œ„ํ”„ํŠธ ์™•์ดˆ๋ณด์ด์‹ ๋ถ„๋“ค,,,,, ํ™”์ดํŒ…์ž…๋‹ˆ๋‹ค!!! ์ฐธ ํ• ๊ฒŒ ๋งŽ๋„ค์š” :)

๋ฐ˜์‘ํ˜•