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

potato's iOS Story/๊ฐœ๋ฐœํ•˜๋ฉด์„œ ๋งŒ๋‚œ ์นœ๊ตฌ๋“ค

[SwiftUI] Button tappable area (๊ธ€์ž๋ฅผ ํด๋ฆญํ•ด์•ผ๋งŒ ๋™์ž‘ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด๋ณด์ž) - contentShape()

๊ฐ์ž ๐Ÿฅ” 2022. 5. 23. 01:05
๋ฐ˜์‘ํ˜•

Gominsee ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋กœ๊ทธ์ธ/๋กœ๊ทธ์•„์›ƒ์˜ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•ด์„œ ํ™”๋ฉด์„ ์ „ํ™˜ํ•˜๋Š” ์ˆ˜์ •์„ ๋‹ด๋‹นํ–ˆ๋‹ค. ์„ค์ • ํŽ˜์ด์ง€์—์„œ '๋กœ๊ทธ์•„์›ƒ'๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋กœ๊ทธ์•„์›ƒ์ด ๋˜์–ด์•ผํ•˜๋Š”๋ฐ, ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

์ •ํ™•ํ•˜๊ฒŒ ์ด "๋กœ๊ทธ์•„์›ƒ"์ด๋ผ๋Š” ๊ธ€์”จ๋ฅผ ํด๋ฆญํ•ด์•ผ ๋กœ๊ทธ์•„์›ƒ์ด ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ ์œผ๋กœ ๋ดค์„๋•Œ, ์ €๋ ‡๊ฒŒ ์˜์—ญ์ด ๋‚˜๋ˆ ์ ธ์žˆ์œผ๋ฉด '๋กœ๊ทธ์•„์›ƒ'์ด ์žˆ๋Š” row ์ „์ฒด ์–ด๋””๋“  ํด๋ฆญํ•ด์•ผ ๋กœ๊ทธ์•„์›ƒ์ด ๋˜์–ด์•ผํ•  ๊ฒƒ์ด๋‹ค. ์•„๋ž˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ ๋นจ๊ฐ„์ƒ‰ ๋ถ€๋ถ„ ์ „์ฒด๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ ๋ง์ด๋‹ค.

ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ Button์˜ ํ„ฐ์น˜์˜์—ญ์œผ๋กœ ์ˆ˜์ •์„ ์—ฌ๋Ÿฌ๋ฒˆ ํ•œ ๊ฒฝํ—˜์ด ์žˆ์ง€๋งŒ, ๋”ฐ๋กœ ์ •๋ฆฌํ•ด๋‘์ง€ ์•Š์•„์„œ ์ด๋ฒˆ์— ๋˜ ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ณด๊ณ  ์ด ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ–ˆ๋‹ค. ์ด์ œ๋ถ€ํ„ฐ๋ผ๋„ ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์ •๋ฆฌ๋ฅผ ํ•ด๋‘๋ ค๊ณ  ํ•œ๋‹ค.

 

๐Ÿ‘‰ 1. View ํƒ€์ž…์ธ Text + onTapGesture์ด์šฉํ•˜๊ธฐ

<์ •๋ฆฌํ•ด์„œ ๋งํ•˜์ž๋ฉด>

  • Text ์— onTapGesture๋กœ action์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • frame์„ ๋„“์€ ์˜์—ญ์œผ๋กœ ์žก์•„์ค€ ๋’ค, backgroundColor๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ํ•ด๋‹น frameํฌ๊ธฐ๋งŒํผ touchable area๊ฐ€ ํ™•์žฅ๋œ๋‹ค.
  • ๋งŒ์•ฝ frame๋งŒ ์žก๊ณ , backgroundColor๋ฅผ ๋„ฃ์ง€ ์•Š์€ clear ํ•œ ์ƒํƒœ๋ผ๋ฉด, .contentShape(//๋„ํ˜•์ด๋ฆ„)์„ ์ถ”๊ฐ€ํ•˜์ž.

 

<์ƒ์„ธ ์„ค๋ช…>

Button(action: {
        // action
        }, label: {
                Text("๋กœ๊ทธ์•„์›ƒ")
		}

์ด๋ ‡๊ฒŒ ๋ฒ„ํŠผํ˜•์‹์œผ๋กœ ๋งŒ๋“ค์—ˆ์„๋•Œ, ์œ„์™€ ๊ฐ™์€ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•œ ๊ฒƒ์ด๋‹ค. ์›๋ž˜ Button ์€ label ์ด touch area ๋ผ๊ณ  ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๊ฒƒ์„ Text๋กœ ๋ฐ”๊พธ๊ณ , onTapGesture๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฒ„ํŠผ์ฒ˜๋Ÿผ ๋งŒ๋“ค์—ˆ๋‹ค.

Text("๋กœ๊ทธ์•„์›ƒ")
    .foregroundColor(.blue)
    .frame(maxWidth: .infinity, alignment: .leading)
    .onTapGesture {
		print("๋กœ๊ทธ์•„์›ƒ ํ„ฐ์น˜")
    }

์ด์ฒ˜๋Ÿผ Text๋กœ ๋งŒ๋“ค๊ณ  frame์„ ์ฃผ์–ด text์˜ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค. Frame์„ ์ฃผ๋ฉด ์•„๋ž˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ Text์˜ ์˜์—ญ์ด ๋„“๊ฒŒ ์žกํžŒ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๊ณ  build๋ฅผ ํ•ด๋ดค๋Š”๋ฐ, ๊ทธ๋ž˜๋„ ๋˜‘๊ฐ™์ด Text๋ฅผ ํด๋ฆญํ•ด์•ผ๋งŒ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ์•„๋ž˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ ์ƒ‰์ƒ์„ ๋„ฃ์–ด๋ณด์•˜๋‹ค.

์œ„ ์‚ฌ์ง„์ฒ˜๋Ÿผ ์ƒ‰์ƒ์„ ๋„ฃ๋Š”๋‹ค๋ฉด ์ •์ƒ์ ์œผ๋กœ ๋นจ๊ฐ„๋ถ€๋ถ„ ์•„๋ฌด๋ฐ๋‚˜ ๋ˆŒ๋Ÿฌ๋„ ํ„ฐ์น˜๊ฐ€ ๊ฐ€๋Šฅํ–ˆ๋‹ค. ๋ญ๊ฐ€ ๋ฌธ์ œ์ธ๊ฐ€ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ, frame์œผ๋กœ ์žกํžŒ ์˜์—ญ์ด clearํ•œ ์ƒํƒœ์˜€๊ธฐ ๋•Œ๋ฌธ์— touchable ํ•˜์ง€ ์•Š์•˜๋˜ ๊ฒƒ์ด์—ˆ๋‹ค. clearํ•œ ์ƒํƒœ์—์„œ๋„ touchableํ•˜๋„๋ก ๋ฐ”๊ฟ”์ฃผ๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ–ˆ๋‹ค.

Text("๋กœ๊ทธ์•„์›ƒ")
    .foregroundColor(.blue)
    .frame(maxWidth: .infinity, alignment: .leading)
    .contentShape(Rectangle())
    .onTapGesture {
		print("๋กœ๊ทธ์•„์›ƒ ํ„ฐ์น˜")
    }

.contentShape(Rectangle())

์œ„ ์ฝ”๋“œ๋Š” ์•ˆ์— ๋ญ๊ฐ€์žˆ๋“ ์—†๋“  ์ „์ฒด stack์„ ๋ชจ๋‘ ํ„ฐ์น˜ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์„๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค. stack์„ container๊ฐ€ ์•„๋‹ˆ๋ผ Rectangle์ด๋ผ๋Š” shape๋กœ ์ธ์‹ํ•˜๊ฒŒ ํ•ด์„œ ๋ชจ๋“  ์˜์—ญ์„ tappableํ•˜๊ฒŒ ํ•˜๋Š” ์›๋ฆฌ์ด๋‹ค.

 

๐Ÿ‘‰ 2. Button ์˜ label ์— frame ์‚ฌ์ด์ฆˆ๋ฅผ ๋„“๊ฒŒ ์ฃผ๊ธฐ 

๋ฒ„ํŠผ๊ณผ, label์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ๋™์ผํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๋น„๊ต์  ๊ฐ„๋‹จ!

 Button(action: {
    print("๋กœ๊ทธ์•„์›ƒ ํ„ฐ์น˜ - ๋ฒ„ํŠผํ˜•์‹")
    }, label: {
        Text("๋กœ๊ทธ์•„์›ƒ")
            .frame(maxWidth: .infinity, alignment: .leading)
    })

 

 

button ํ˜•์‹์œผ๋กœ ๋งŒ๋“œ๋Š”๊ฒŒ ๋” ๊น”๋”ํ•˜๊ณ .. ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด์—ฌ์„œใ…“..?  ์ข‹์€ ๋ฐฉ์‹์ธ๊ฑฐ ๊ฐ™๊ธฐ๋„..? 

๋ฐ˜์‘ํ˜•