๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐ŸŽ iOS & ๐Ÿ”น Flutter/๐Ÿ”ฅ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…14

[iOS/Swift]๋ฒ„ํŠผ์€ ํ•œ ๋ฒˆ๋งŒ ๋ˆŒ๋ €๋Š”๋ฐ View๊ฐ€ ๋‘ ๋ฒˆ ๋ถˆ๋ฆฐ๋‹ค? ์•„์ฃผ ์š”์ƒํ•œ ์ผ์ด ์žˆ์—ˆ๋‹ค. ์ด๋ฏธ์ง€ ์ €์žฅํ•˜๊ธฐ๋ฅผ ๋ˆŒ๋ €๋Š”๋ฐ, ์ €์žฅ ์™„๋ฃŒ ํ˜น์€ ์ €์žฅ ์‹คํŒจ ํŒ์—…์ด ๋‘ ๋ฒˆ ๋ถˆ๋ฆฌ๋Š” ๊ฒŒ ์•„๋‹Œ๊ฐ€?๋กœ์ง์—์„œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‚˜ ์‹ถ์–ด์„œ ํŒ์—…์„ ํ˜ธ์ถœํ•˜๋Š” ๋ถ€๋ถ„์— ๋ธŒ๋ ˆ์ดํฌ ํฌ์ธํŠธ๋ฅผ ์ฐ์–ด๋ณด์•˜๋Š”๋ฐ, ๋ธŒ๋ ˆ์ดํฌ ํฌ์ธํŠธ๋„ ํ•œ ๋ฒˆ๋งŒ ์žกํ˜”๋‹ค!!์™œ ํŒ์—… ํ˜ธ์ถœ์€ ํ•œ ๋ฒˆ ๋งŒ ๋˜๋Š”๋ฐ ๋ทฐ๋Š” ๋‘๊ฐœ๊ฐ€ ๋ถˆ๋ฆฌ์ง€...? ์ด๊ฑฐ ์—‘์Šค์ฝ”๋“œ ์ž˜๋ชป ์•„๋‹ˆ์•ผ?! ๋ผ๊ณ  ๊ดœํ•œ ํƒ“์„ ํ•ด๋ณด์•˜์ง€๋งŒ.์–ธ์ œ๋‚˜ ์ฝ”๋“œ๋Š” ๊ฑฐ์ง“๋ง์„ ์•ˆํ•˜๋Š”~ ์‘ ๋™์ผํ•œ ๋ทฐ๋ชจ๋ธ ๊ณต์œ ํ•œ ๋‚ด ์ž˜๋ชป~ํ˜„์žฌ ๋‚ด ํ”„๋กœ์ ํŠธ์—๋Š” ํ”„๋กœํ•„ ์ด๋ฏธ์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ˆœ๊ฐ„์ด ๋‘ ๋ฒˆ ์กด์žฌํ•œ๋‹ค.1. ์ฒ˜์Œ์— ํ”„๋กœํ•„์„ ๋‹ค ์ƒ์„ฑํ•œ ํ›„ 2. ๋งˆ์ด ํŽ˜์ด์ง€์—์„œ ํ”„๋กœํ•„ ์นด๋“œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ ๊ฒฝ์šฐ๋ทฐ์—๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๊ธฐ์— ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋ทฐ๋ฅผ ๋งŒ๋“ค๊ณ  ๋ทฐ๋ชจ๋ธ๋งŒ ๊ณต์œ ํ•ด ์คฌ์—ˆ๋Š”๋ฐ, ์ด๋•Œ ๊ฐ์ž ๋‹ค๋ฅธ ๋ทฐ๋ชจ๋ธ์„ ์ƒ์„ฑํ•ด์„œ ๋„ฃ์–ด์ค€ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ DIMa.. 2024. 7. 4.
[iOS/Swift] UIView to UIImage without Display ์š”์ฆ˜ IT ๋™์•„๋ฆฌ ํ”„๋กœ๊ทธ๋ผํ”ผ์—์„œ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋Š” ์ค‘์ด๋‹ค. ํ”„๋กœํ•„ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ณด์—ฌ์ฃผ๋Š” ํ”„๋กœ์ ํŠธ์ธ๋ฐ, 1:1 ์ •๋ฐฉํ–ฅ์˜ ํ”„๋กœํ•„๊ณผ 3:4 ์„ธ๋กœํ˜•์˜ ํ”„๋กœํ•„ ์‚ฌ์ง„ ๊ตฌํ˜„์„ ๋ณด์—ฌ์ฃผ๋ฉด์„œ ๊ณ ๋ฏผ์ด ์ƒ๊ฒผ๋‹ค. ๋””์ž์ธ ์ƒ ์ด๋ฏธ์ง€ ๋ฐ‘์˜ ๋ฒ„ํŠผ์ด ๊ฒน์น˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด 3:4 ์„ธ๋กœํ˜•์˜ height๋ฅผ ๋ฏธ๋ฆฌ ๊ตฌํ˜„ํ•œ ๋’ค ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“ค์–ด ์ €์žฅํ•˜๊ณ  ๋ณด์—ฌ์ค„ ๋•Œ๋Š” ๊ฐ€๋กœ ๋„“์ด๋ฅผ ์„ธ๋กœ ๊ธธ์ด์— ๋งž์ถ”์–ด ์ค„์ด๋Š” ํ˜•์‹์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ–ˆ๋‹ค.๋ฌผ๋ก , ์ด๋ ‡๊ฒŒ ๋ณด์ด๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ์ด๋ฏธ์ง€๋กœ ์ €์žฅํ•˜๊ธฐ๋ฅผ ๋ˆ„๋ฅด๋ฉด 3:4์˜ ๊ฒฝ์šฐ ์˜†์˜ ํšŒ์ƒ‰ ์—†์ด ์นด๋“œ ์ด๋ฏธ์ง€๋งŒ ์ €์žฅ๋˜์–ด์•ผ ํ–ˆ๋‹ค. ๋•Œ๋ฌธ์— view ๊ณ„์ธต์˜ ์ œ์ผ ๋ฐ‘์—์„œ CardView๋ฅผ ๊ทธ๋ฆฌ๊ณ , ํ•ด๋‹น UIView๋ฅผ UIImage๋กœ ์ €์žฅํ•˜์—ฌ ๋ถˆ๋Ÿฌ์™”๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๋•Œ ์‹œ์ ์˜ ์ฐจ์ด ๋•Œ๋ฌธ์— UIImage๊ฐ€ ๋œจ์ง€ ์•Š์•˜๋‹ค. ๊ณ ๋ฏผํ•˜๋‹ค ์ฒ˜.. 2024. 7. 2.
[iOS] Image url ํ†ตํ•ด ๊ฐ€์ ธ์™€์„œ view์— ๋„์šฐ๊ฑฐ๋‚˜ ๊ฐค๋Ÿฌ๋ฆฌ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ• 2๊ฐ€์ง€ ๋น„๊ต ์ด๋ฒˆ์— unsplash์˜ api๋ฅผ ๋ฐ›์•„์„œ json ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•ด๋ณด๋‹ˆ ์‹ ๊ธฐํ•œ ์ ์ด ์žˆ์—ˆ๋‹ค. image๋Š” ๋”ฐ๋กœ url ์ข…๋ฅ˜๋กœ ์ฃผ์–ด์ง€๊ณ , ํ•ด๋‹น url์„ ๋‹ค์‹œ ๋ฐ›์•„์™€์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ! ๋•Œ๋ฌธ์— image๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•˜์—ฌ imageView์— ๋„ฃ์–ด์ฃผ๋Š” protocol์„ ํ•˜๋‚˜ ๋งŒ๋“ค์—ˆ๋‹ค. protocol ImageViewDownloadable { var imageView: UIImageView { get set } } ๊ทธ๋ฆฌ๊ณ  extension์œผ๋กœ ์ด ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๊ณ  ์žˆ๋‹ค๋ฉด image๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜๋„ ์žˆ๊ณ , ๊ฐค๋Ÿฌ๋ฆฌ์— ๋‹ค์šด๋ฐ›์„ ์ˆ˜๋„ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋“ค์„ ๊ฐ๊ฐ ๊ตฌํ˜„ํ•˜์˜€๋‹ค. 1. URLSession.shared.dataTask , @escaping closure ๊ทธ๋ ‡๊ฒŒ ๋งŒ๋“  ์ฒซ ๋ฐฉ๋ฒ•์€ dataTask์˜ @escaping c.. 2024. 2. 14.
[iOS] UICollectionViewFlowLayout์œผ๋กœ Pinterest Layout ๊ตฌํ˜„ํ•˜๊ธฐ ์ฒ˜์Œ ๊ณผ์ œ๋กœ ๋ฐ›์€ ํ”ผ๊ทธ๋งˆ์— Pinterest๋กœ ๊ตฌํ˜„๋œ View๋ฅผ ๋ณด๊ณ , Compositional๋กœ ๋„์ „ํ•ด์•ผ์ง€! ๋ผ๊ณ  ํ˜ธ๊ธฐ๋กญ๊ฒŒ ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Compositional์˜ ๋ฒฝ์€ ๋†’์•˜๊ณ .. item๊ณผ group, section์œผ๋กœ ํฌ๊ธฐ๋ฅผ ์ฃผ๋Š” ๊ฒƒ์—์„œ item ํฌ๊ธฐ๋“ค์„ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๊ฒŒ ์ค˜์•ผ ํ• ์ง€ ๊ฐ์ด ์•ˆ ์žกํžˆ๋”๋ผ. Section๋ณ„๋กœ๋Š” ์‰ฌ์šด๋ฐ!! ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ๊นŒ๋ณด๋ฉด, Compositional + Combine์˜ ์กฐํ•ฉ์œผ๋กœ pinterest๊ฐ€ ๊ตฌํ˜„๋˜์–ด ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ RxSwift๋‚˜ Combine์„ ์•„์ง ์ž˜ ๋ชจ๋ฅด๋Š”๋ฐ, ๊ณผ์ œ ๊ธฐ๊ฐ„์€ ๋งค์šฐ ์งง์•˜๊ธฐ์— ์ฐจ๋งˆ ์ด๋ฒˆ์— ๋„์ „ํ•  ์ž์‹ ์€ ์—†์—ˆ๋‹ค. ์ด๋ฏธ collectionView, diffable data source, compositional ๋“ฑ ์ฒ˜์Œ ์จ๋ณด๋Š” ๊ฒƒ์ด ์‚ฐ๋”๋ฏธ..... 2024. 1. 31.
[iOS] Test ํŒŒ์ผ์„ ๋„ฃ์„ Asset ์ƒ์„ฑ์‹œ ์˜ค๋ฅ˜_ Bundle ์‚ฌ์šฉ ํ…Œ์ŠคํŠธ์šฉ JSON ํŒŒ์ผ์€ ์ดํ›„์—๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๊ธฐ์— test ํด๋”์— ๋”ฐ๋กœ Asset catalog๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ทธ๊ณณ์—์„œ๋งŒ ๋„ฃ์–ด๋‘๊ณ  ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค. ๋•Œ๋ฌธ์— ํด๋”๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ์ด๋ฆ„์„ Json.xcassets ์œผ๋กœ ์„ ์–ธํ•˜๊ณ  ๊ทธ ์•ˆ์— ํŒŒ์ผ์„ ๋„ฃ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ asset catalog์˜ ๋ชจ์–‘์ด ๊ธฐ์กด์˜ ๊ฒƒ๊ณผ๋Š” ๋‹ฌ๋ž๋‹ค. ํ™•์ธํ•ด๋ณด๋‹ˆ asset catalog๋ฅผ ๋งŒ๋“ค๋•Œ๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ ํด๋”๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ File → New → File์„ ํƒ€๊ณ  ๋“ค์–ด๊ฐ€ Resource์˜ Asset Catalog๋ฅผ ์„ ํƒํ•˜์—ฌ ๋งŒ๋“ค์–ด์•ผ ํ–ˆ๋‹ค. ๊ทธ ํ›„ test code๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๋Œ๋ฆฌ๋Š”๋ฐ ์ด๋ฒˆ์—๋Š” NSDataAsset์„ ๊ฐ€์ ธ์˜ค๋Š” guard๋ฌธ์—์„œ ๊ณ„์† retrun์œผ๋กœ ๋น ์ง€๋ฉฐ ์ข…๋ฃŒ๋˜์—ˆ๋‹ค. guard let json = NSDataAsset(n.. 2024. 1. 28.
[iOS] TableViewCell์—์„œ layoutMarginsGuide ์‚ฌ์šฉ ํ…Œ์ด๋ธ”๋ทฐ์˜ Custom Cell์„ ์„ค์ •ํ•  ๋•Œ ์ฒ˜์Œ์— ์ œ์•ฝ์กฐ๊ฑด์„ ContentView์—๋งŒ ๋งž์ท„๋‹ค. private func configureCellConstraint() { NSLayoutConstraint.activate([ contentStackView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor), contentStackView.topAnchor.constraint(equalTo: contentView.topAnchor), contentStackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor), contentStackView.bottomAnchor.constraint(e.. 2024. 1. 6.