sladuf
200
sladuf
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (83)
    • ๐Ÿ“š Programming (32)
      • Swift (13)
      • JAVA (2)
      • Python (6)
      • SQL (6)
      • Web (5)
    • ๐Ÿ“ฑ iOS (25)
      • Base (7)
      • SwiftUI (9)
      • UIKit (7)
      • ์ธ๊ฐ• & ์ฑ… (2)
    • ๐Ÿ”— Algorithm (20)
      • Python (12)
      • Swift (3)
      • Tip (5)
    • ๐Ÿ—‚ ETC (6)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • ์Šค์œ„ํ”„ํŠธ
  • Swift

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

๊ธ€์“ฐ๊ธฐ ์„ค์ •
hELLO ยท Designed By ์ •์ƒ์šฐ.
sladuf

200

[SwiftUI] Grid์†์„ฑ
๐Ÿ“ฑ iOS/SwiftUI

[SwiftUI] Grid์†์„ฑ

2022. 7. 5. 01:56

 

 

 

 

Grid์˜ ์†์„ฑ์— ๋Œ€ํ•ด์„œ ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.

 

Grid์˜ ์ข…๋ฅ˜ : LazyHGrid, LazyVGrid

์†์„ฑ : fixed, flexible, adaptive

 

 

LazyVGrid

๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง์œผ๋กœ ๋‚˜์—ดํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜์ง์œผ๋กœ ๋‚˜์—ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— column์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. column์€ ์„ธ๋กœ ํ•œ ์ค„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

var body: some View {
    LazyVGrid(columns: columns) {
        ForEach(0..<10){num in
            Image(systemName: "person")
                .resizable()
                .aspectRatio(contentMode: .fit)
        }
    }
}

 

์œ„์˜ ์ฝ”๋“œ๋Š” columns๋ผ๋Š” ํ”„๋กœํผํ‹ฐ์— ๊ทธ ์†์„ฑ์„ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณด์—ฌ์ค„์ง€์— ๋Œ€ํ•œ ์†์„ฑ์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

columns ํ”„๋กœํผํ‹ฐ์— ๋‹ด์„ ์†์„ฑ์€ ํฌ๊ฒŒ ์„ธ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

fixed

๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๋ฅผ ๊ณ ์ •ํ•ด์„œ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์˜ˆ์‹œ ์ฝ”๋“œ๋Š” ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๋ฅผ 50์œผ๋กœ ๊ณ ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

var columns: [GridItem] {
    [GridItem(.fixed(50))]
}

 

๋ณด์‹œ๋‹ค์‹œํ”ผ column์€ ์„ธ๋กœ ํ•œ ์ค„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ์ค„์„ ๋‚˜ํƒ€๋‚ด๊ณ  ์‹ถ๋‹ค๋ฉด  []์— GridItem()์„ ์—ฌ๋Ÿฌ๊ฐœ ์ž…๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์„ธ์ค„, ๋„ค์ค„์„ ๋‚˜ํƒ€๋‚ด๊ณ  ์‹ถ์œผ๋ฉด GridItem์„ ๋” ์ถ”๊ฐ€ํ•˜๋ฉด ๋˜๊ฒ ์ฃ  ?!

var columns: [GridItem] {
    [GridItem(.fixed(50)),
     GridItem(.fixed(50))]
}

 

column๋งˆ๋‹ค ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var columns: [GridItem] {
    [GridItem(.fixed(30)),
     GridItem(.fixed(50))]
}

 

 

flexible

์ด๋ฆ„๋Œ€๋กœ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ์กฐ์ ˆํ•ฉ๋‹ˆ๋‹ค.

minimum๊ฐ’๊ณผ maximum๊ฐ’์„ ๊ฐ€์ง€๋Š”๋ฐ ๊ธฐ๋ณธ์ ์œผ๋กœ maximum๊ฐ’์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— minimum๊ฐ’์„ ์ƒ๋žตํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค!

var columns: [GridItem] {
    //[GridItem(.flexible(minimum: 10,maximum: 200))]
    [GridItem(.flexible(maximum: 200))]
}

 

์—ฌ๋Ÿฌ์ค„๋กœ ๋งŒ๋“ค๋ฉด ์œ ์—ฐํ•˜๊ฒŒ ํฌ๊ธฐ๋ฅผ ์กฐ์ ˆํ•ฉ๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ์œผ๋กœ ์ค„์ž…๋‹ˆ๋‹ค.

var columns: [GridItem] {
    [GridItem(.flexible(maximum: 200)),
     GridItem(.flexible(maximum: 200)),
     GridItem(.flexible(maximum: 200)),
     GridItem(.flexible(maximum: 200))]
}

 

 

adaptive

ํฌ๊ธฐ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ์กฐ์ ˆํ•œ๋‹ค๋Š” ์ ์—์„œ flexible๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ๋ช…ํ™•ํ•œ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ์„  adaptive๋Š” minimum๊ฐ’์„ ๋”ฐ๋ฅธ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— maximum๊ฐ’์˜ ์ƒ๋žต์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.)

๋˜, adaptive๋Š” GridItem์†์„ฑ์ด ํ•˜๋‚˜๋ผ๋„ ํ™”๋ฉด์— ์ตœ๋Œ€ํ•œ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ์ค„์— ๊ฑฐ์ณ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

var columns: [GridItem] {
    //[GridItem(.adaptive(minimum: 50, maximum: 200))]
    [GridItem(.adaptive(minimum: 50))]
}

 

daptive๋Š” ๋‚ด๊ฐ€ ์ง€์ •ํ•œ ์ปฌ๋Ÿผ์˜ ๊ฐฏ์ˆ˜์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ์—ฌ๋Ÿฌ์ค„์— ๊ฑฐ์ณ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž‘์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๋Š” ํฐ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ปฌ๋Ÿผ์— ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์—†๊ณ  view์˜ ํฌ๊ธฐ๋ฅผ ๊ฐฏ์ˆ˜๋งŒํผ ์ผ์ •ํ•˜๊ฒŒ ์นธ์„ ๋‚˜๋ˆ„์–ด ๋ฐ์ดํ„ฐ์— ์†์„ฑ์„ ์ ์šฉ์‹œํ‚ต๋‹ˆ๋‹ค.

var columns: [GridItem] {
    [GridItem(.adaptive(minimum: 50)),
     GridItem(.adaptive(minimum: 10)),
     GridItem(.adaptive(minimum: 30)),
     GridItem(.adaptive(minimum: 50))]
}

 

 


 

LazyHGrid

๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜ํ‰์œผ๋กœ ๋‚˜์—ดํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜ํ‰์œผ๋กœ ๋‚˜์—ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— rows๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. rows๋Š” ๋ฐ์ดํ„ฐ ํ•œ ์ค„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

LazyHGrid(rows: rows) {
    ForEach(0..<50){num in
        Image(systemName: "person")
            .resizable()
            .aspectRatio(contentMode: .fit)
    }
}

 

์œ„์˜ ์ฝ”๋“œ๋Š” rows๋ผ๋Š” ํ”„๋กœํผํ‹ฐ์— ๊ทธ ์†์„ฑ์„ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณด์—ฌ์ค„์ง€์— ๋Œ€ํ•œ ์†์„ฑ์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

VGrid์˜ columns๊ณผ ๋™์ผํ•˜๊ฒŒ rows๋„ ์„ธ๊ฐ€์ง€ ์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

fixed

var rows: [GridItem] {
    [GridItem(.fixed(50))]
}

 

๊ธฐ๋ณธ์ ์œผ๋กœ rows๋Š” ๊ฐ€๋กœ ํ•œ ์ค„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

VGrid์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์—ฌ๋Ÿฌ์ค„์„ ๋‚˜ํƒ€๋‚ด๊ณ  ์‹ถ๋‹ค๋ฉด  []์— GridItem()์„ ์—ฌ๋Ÿฌ๊ฐœ ์ž…๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

var rows: [GridItem] {
    [GridItem(.fixed(50)),
     GridItem(.fixed(50))]
}

 

row๋งˆ๋‹ค ๋‹ค๋ฅธ ํฌ๊ธฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

var rows: [GridItem] {
    [GridItem(.fixed(30)),
     GridItem(.fixed(20)),
     GridItem(.fixed(10))]
}

 

 

flexible

var rows: [GridItem] {
    [GridItem(.flexible(maximum: 200))]
}

 

5์ค„์„ ๋‹ค ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ํฌ๊ธฐ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ์กฐ์ ˆํ•ฉ๋‹ˆ๋‹ค.

var rows: [GridItem] {
    [GridItem(.flexible(maximum: 200)),
     GridItem(.flexible(maximum: 200)),
     GridItem(.flexible(maximum: 200)),
     GridItem(.flexible(maximum: 200)),
     GridItem(.flexible(maximum: 200))]
}

 

 

adaptive

๊ฐ€๋กœ์ค„์˜ ๊ฐฏ์ˆ˜๊ฐ€ ๋‚ด๊ฐ€ ์ง€์ •ํ•œ ๊ฒƒ๊ณผ ์ƒ๊ด€์—†์ด ์ตœ๋Œ€ํ•œ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋„๋ก ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.

var rows: [GridItem] {
    [GridItem(.adaptive(minimum: 50))]
}

 

 

 

 

 

 

 

 

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'๐Ÿ“ฑ iOS > SwiftUI' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[SwiftUI] TabView ํŽ˜์ด์ง€ ์ด๋™์‹œ TabBar , NavigationBar Hidden ์ฒ˜๋ฆฌํ•˜๊ธฐ  (0) 2022.08.14
๋””๋ฐ”์ด์Šค ํ™”๋ฉด๊ณ ์ • portrait only  (0) 2022.07.25
URLSession์„ ํ†ตํ•ดJSON ๊ฐ€์ ธ์˜ค๊ธฐ (2)  (0) 2022.07.04
URLSession์„ ํ†ตํ•ดJSON ๊ฐ€์ ธ์˜ค๊ธฐ (1)  (0) 2022.06.28
Auto Layout 1 [Why?]  (0) 2022.05.31
    '๐Ÿ“ฑ iOS/SwiftUI' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [SwiftUI] TabView ํŽ˜์ด์ง€ ์ด๋™์‹œ TabBar , NavigationBar Hidden ์ฒ˜๋ฆฌํ•˜๊ธฐ
    • ๋””๋ฐ”์ด์Šค ํ™”๋ฉด๊ณ ์ • portrait only
    • URLSession์„ ํ†ตํ•ดJSON ๊ฐ€์ ธ์˜ค๊ธฐ (2)
    • URLSession์„ ํ†ตํ•ดJSON ๊ฐ€์ ธ์˜ค๊ธฐ (1)
    sladuf
    sladuf

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”