๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŽ iOS/๐Ÿ”ฅ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

[iOS/Swift] UIView to UIImage without Display

by MINT09 2024. 7. 2.

์š”์ฆ˜ IT ๋™์•„๋ฆฌ ํ”„๋กœ๊ทธ๋ผํ”ผ์—์„œ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋Š” ์ค‘์ด๋‹ค. 

ํ”„๋กœํ•„ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ณด์—ฌ์ฃผ๋Š” ํ”„๋กœ์ ํŠธ์ธ๋ฐ, 1:1 ์ •๋ฐฉํ–ฅ์˜ ํ”„๋กœํ•„๊ณผ 3:4 ์„ธ๋กœํ˜•์˜ ํ”„๋กœํ•„ ์‚ฌ์ง„ ๊ตฌํ˜„์„ ๋ณด์—ฌ์ฃผ๋ฉด์„œ ๊ณ ๋ฏผ์ด ์ƒ๊ฒผ๋‹ค. ๋””์ž์ธ ์ƒ ์ด๋ฏธ์ง€ ๋ฐ‘์˜ ๋ฒ„ํŠผ์ด ๊ฒน์น˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด 3:4 ์„ธ๋กœํ˜•์˜ height๋ฅผ ๋ฏธ๋ฆฌ ๊ตฌํ˜„ํ•œ ๋’ค ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“ค์–ด ์ €์žฅํ•˜๊ณ  ๋ณด์—ฌ์ค„ ๋•Œ๋Š” ๊ฐ€๋กœ ๋„“์ด๋ฅผ ์„ธ๋กœ ๊ธธ์ด์— ๋งž์ถ”์–ด ์ค„์ด๋Š” ํ˜•์‹์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ–ˆ๋‹ค.

1:1 ์ด๋ฏธ์ง€
3:4 ์ด๋ฏธ์ง€

๋ฌผ๋ก , ์ด๋ ‡๊ฒŒ ๋ณด์ด๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ์ด๋ฏธ์ง€๋กœ ์ €์žฅํ•˜๊ธฐ๋ฅผ ๋ˆ„๋ฅด๋ฉด 3:4์˜ ๊ฒฝ์šฐ ์˜†์˜ ํšŒ์ƒ‰ ์—†์ด ์นด๋“œ ์ด๋ฏธ์ง€๋งŒ ์ €์žฅ๋˜์–ด์•ผ ํ–ˆ๋‹ค. ๋•Œ๋ฌธ์— view ๊ณ„์ธต์˜ ์ œ์ผ ๋ฐ‘์—์„œ CardView๋ฅผ ๊ทธ๋ฆฌ๊ณ , ํ•ด๋‹น UIView๋ฅผ UIImage๋กœ ์ €์žฅํ•˜์—ฌ ๋ถˆ๋Ÿฌ์™”๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๋•Œ ์‹œ์ ์˜ ์ฐจ์ด ๋•Œ๋ฌธ์— UIImage๊ฐ€ ๋œจ์ง€ ์•Š์•˜๋‹ค. 

๊ณ ๋ฏผํ•˜๋‹ค ์ฒ˜์Œ์—๋Š” 3:4์ผ ๋•Œ ํฐํŠธ ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋‹ˆ 1:1์ผ๋•Œ์™€ 3:4์ผ๋•Œ ๋ฌ˜ํ•˜๊ฒŒ ํฐํŠธ ํฌ๊ธฐ๊ฐ€ ์ฐจ์ด๊ฐ€ ์žˆ์—ˆ๊ณ  ์ด๋ฅผ ๋งž์ถ”๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š์•˜๋‹ค. 

๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ์‹œ์ ์˜ ์ฐจ์ด์—์„œ ์˜๊ฐ์„ ์–ป์–ด viewDidLayoutSubviews๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    if squareImage == nil {
    	loadCardImages()
    }
}

private func loadCardImages() {
//1:1๊ณผ 3:4 UIView์—์„œ ์ด๋ฏธ์ง€ ์ƒ์„ฑ
    squareImage = squareProfileView.asImage()
    rectangleImage = rectangleProfileView.asImage()

//์ด๋ฏธ์ง€๋งŒ ์žˆ์œผ๋ฉด ๋˜๋‹ˆ UIView๋Š” ๊ณ„์ธต์—์„œ ๋‚ด๋ฆผ
    squareProfileView.removeFromSuperview()
    rectangleProfileView.removeFromSuperview()
    
//๋ณด์—ฌ์งˆ ํ”„๋กœํ•„ ํŽ˜์ด์ง€์˜ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•œ 1:1 ์ด๋ฏธ์ง€๋กœ ๋ฐ”๊ฟˆ
    profileImageView.image = squareImage
    
//์ƒ์„ฑํ•œ 2๊ฐœ์˜ ์ด๋ฏธ์ง€๋ฅผ filemanager์— ์ €์žฅ -> ์ถ”ํ›„ ์นด์นด์˜คํ†ก ๊ณต์œ ํ•˜๊ธฐ ๊ธฐ๋Šฅ ๋•Œ๋ฌธ์—
    ImageManager.saveImageToDirectory(identifier: .squareCard, image: squareImage)
    ImageManager.saveImageToDirectory(identifier: .rectangleCard, image: rectangleImage)
}

๊ธฐ์กด์—๋Š” subview์ธ CardView์˜ layout์ด ์™„์„ฑ๋˜๊ธฐ ์ „์— View๊ฐ€ ๋งŒ๋“ค์–ด์ ธ ๋ฒ„๋ ธ๊ธฐ์— ImageView์— ๋นˆ ์ด๋ฏธ์ง€๊ฐ€ ๋“ค์–ด๊ฐ€๊ณ  ์žˆ์—ˆ๋‹ค. ๋•Œ๋ฌธ์— subview๋“ค์ด ๋‹ค ์ƒ์„ฑ๋œ ํ›„์ธ viewDidLayoutSubviews()์—์„œ image๋ฅผ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค. 

https://developer.apple.com/documentation/uikit/uiviewcontroller/1621398-viewdidlayoutsubviews

 

viewDidLayoutSubviews() | Apple Developer Documentation

Notifies the view controller when its view finishes laying out its subviews.

developer.apple.com

 

์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค!

https://apps.apple.com/kr/app/roome/id6503616766

 

‎roome

‎๋ฐฉ ํƒˆ์ถœ ํ”„๋กœํ•„ ์ œ์ž‘ ์„œ๋น„์Šค ๋ฃจ๋ฏธ๋ฅผ ํ†ตํ•ด ๋‚˜์˜ ์„ฑํ–ฅ์„ ๋น ๋ฅด๊ฒŒ ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“ค์–ด ๋ณด์„ธ์š”. ๋ฃจ๋ฏธ๋Š” ๋ฐฉ ํƒˆ์ถœ์„ ์ข‹์•„ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋‚˜์˜ ์ทจํ–ฅ์„ ๋‹ด์€ ํ”„๋กœํ•„์„ ์ด๋ฏธ์ง€ 1์žฅ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค

apps.apple.com