ํด๋น ๊ธ๊ณผ ๊ด๋ จ๋ Pull Request๋ฅผ ์ฌ๋ ค๋ก๋๋ค. ์๋๋ฉด!! ๊ต์ฅํ ์์ธํ๊ฒ ๋ฆฌ๋ทฐํด๋ง๊ธฐ ๋๋ฌธ~~ ๊ฐ์ ์ด๋ป๊ฒ ๊ฐ๋ฐํ๋์ง, ์ ์ฒด ์ฝ๋๋ฅผ ์ดํด๋ณด์ค ์ ์์ต๋๋ค. ํํ ๐
https://github.com/DeveloperAcademy-POSTECH/MacC-Team-EarthValley80/pull/117
๐ฃ ๋ด๊ฐ ๋ง๋ค์ด์ผ ํ ๋ฒํผ
๋ด๊ฐ ๋ง๋ค์ด์ผํ ๋ฒํผ์, ์๋์ฒ๋ผ ๋ฅ๊ธ๊ณ ์ด์๊ณ ๊ทธ๋ฆผ์์ง ๋ฒํผ์ด๋ค.
ํด๋น ๋ฒํผ์ ๋ง๋ค๊ธฐ ์ํด์, ๊ธฐ์กด์ ๋ง๋ค์ด๋ ๋ฒํผ์ ์์ ํด์ผํ๋ค. ๊ธฐ์กด๋ฒํผ์ ๊ทธ๋ฅ ๊ฒ์ ์์ด์๊ณ , ๋ด๊ฐ ์ถ๊ฐ๋ก ๊ฐ๋ฐํด์ผํ๋ ๊ฒ์, '๊ธฐ์ฌ ๊ณต์ ํ๊ธฐ'๋ฒํผ์ ์ฝ๊ฐ ํฌ๋ช ์์ ๋ ๋ฐฐ๊ฒฝ์์ ๊ฐ๋๊ฒ์ด๋, ๋ฒํผ๋ค์ shadow๋ฅผ ์ค์ ํ๋๊ฒ!
๋น,, ๋ฒํผ์ shadow๋ฅผ ๋ฃ์ด์ฃผ์ด์ผํ์ต๋๋ค. ๋ฒํผ์ shadow๋ฅผ ๋ฃ์ผ๋ฉด์ ๋ง๋ ๋ฌธ์ ๋, ๋ฐ๋ก '๊ธฐ์ฌ ๊ณต์ ํ๊ธฐ'๋ฒํผ์ด ํฌ๋ช
ํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฆผ์๊ฐ ์๊ธฐ์ง ์๋๋ค๋ ์ ์ด์์ต๋๋ค. (์๋นํ ๋ฌผ๋ฆฌ๊ฐ๋๋ผ๊ณ ์... ๋ฒํผ์ด ํฌ๋ช
ํ๊ธฐ๋๋ฌธ์ ๊ทธ๋ฆผ์๊ฐ ์๊ธฐ์ง ์๋ค๊ณ ๋ผ๊ณ ๋ผ๊ณ ๋ผ,,,)
์ด๊ฒ์ ํด๊ฒฐํ๊ธฐ ์ํด์,,, ์๋จ๊ณผ ๋ฐฉ๋ฒ์ ๊ฐ๋ฆฌ์ง์๊ณ ์ฌ๋ฌ๊ฐ์ง๋ก ๋์ ํด๋ดค๋๋ฐ,, ๊ทธ ๊ณผ์ ์ ์ฌ๊ธฐ๋ค๊ฐ ์์ฑํฉ๋๋ค.
๐ฃ ๋ฒํผ์ ํฌ๋ช ์์ผ๋ก ๋ง๋ค๋ฉด, ๊ทธ๋ฆผ์๊ฐ ์๊ธฐ์ง ์๋๋ค.
๐๐ป ๊ทธ๋ฆผ์๋ฅผ ์ค ๋ฐฉ๋ฒ
self.layer.shadowOpacity = 0.4
self.layer.shadowRadius = 20
self.layer.shadowOffset = CGSize(width: 4, height: 10)
self.layer.shadowColor = UIColor.evyBlack1.cgColor
1๏ธโฃ ๋ฒํผ์ ์์์ alpha๊ฐ์ ๋ฃ์ด์ ํฌ๋ช ํ๊ฒ ๋ง๋ค์ด์ฃผ์.
- ๋ฒํผ์ด ํฐ์์ด๋ผ ์๋ณด์ด๊ฒ ํ๊ธฐ ์ํด์ ๋นจ๊ฐ๋ฐฐ๊ฒฝ์ ๋ฃ์๋ค.
- ๋ค์ฝ์์ด์ / ๊ธฐ์ฌ ๊ณต์ ํ๊ธฐ ๊ธ์ ๋ง๊ณ ๋ฐฐ๊ฒฝ์์ ํฌ๋ช ํ๊ฒ ๋ง๋ค์๋ค.
// hex๋ฅผ ๋ฃ์ด์ UIColor๋ฅผ ๋ณ๊ฒฝํ๋ extension์ ๋ง๋ค์ด๋์ด์ ์ด๋ ๊ฒ ์์ฑํจ.
UIColor(hex: "#FFFFFF", alpha: 0.14)
์ด๋ ๊ฒ ํ๋๊น, ๋ฐฐ๊ฒฝ์ ํฌ๋ช ์์ด ๋์๋๋ฐ ์ ์ ์์์ ์์ฑํด์ค ๊ทธ๋ฆผ์๊ฐ ์๊ธฐ์ง ์๋๋ค. (๋น๊ต๋ฅผ ์ํด ์๋ ๋๊ฐ์ง์ ์ฌ์ง์ ๋ฃ์ด๋ณธ๋ค.)
2๏ธโฃ ๋ฒํผ์ ์์ฒด์ layer opacity๋ฅผ ์กฐ์ ํด๋ณด์.
๊ทธ๋ฆผ์๋ ๋ฌด์กฐ๊ฑด ์๊ฒจ์ผํ๋๊น, ๋ฒํผ์ ์์์ white๋ก ํด์ฃผ๊ณ , button์์ฒด์ opacity๋ฅผ ์กฐ์ ํด๋ณด์.
self.backgroundColor = .evyWhite
self.layer.opacity = 0.14
์ด๋ด์๊ฐ…. ๋ฒํผ์ stroke ์ถ๊ฐํด์ค๊ฒ๋ ์ ๋ถ๋ค ์ฐํด์ก๊ณ , ๊ธ์จ๋,, ,์ด๋ฏธ์ง๋,, ์ ๋ถ ์ฐํด์ก๋ค. ๊ทธ๋๊น ํด๋น ์ฝ๋๋ button์ ์ด๋ฃจ๋ layer ์ ๋ถ์ opacity๋ฅผ ์ฃผ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ์ด๋ ๊ฒ ๋ ์๋ฐ์ ์๋ค. …
๊ทธ๋์ ๋๋, ๋ฒํผ์ white๋ก ๊ทธ๋๋ก ์ฃผ๋, ์๋์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
- ์ฐธ๊ณ ์๋ฃ - https://blog.goodgods.com/605
3๏ธโฃ copy(alpha: )๋ฅผ ์ด์ฉํด๋ณด์
- ๋ฒํผ์ ๋ฐฑ๊ทธ๋ผ์ด๋์ alpha๊ฐ์ ์ฃผ๋๋ฐ, copy ์์๋ค๊ฐ ๋ฃ์ด์ฃผ์๋ค.
button.layer.backgroundColor = (UIColor.white.cgColor).copy(alpha: 0.14)
์ด๋ ๊ฒ ํ๋ฉด, opacity๋ฅผ ์คฌ์๋์ฒ๋ผ ๊ธ์์ stroke๊น์ง ๋ชจ๋ ํฌ๋ช ํด์ง์ง ์๊ณ ๋ฑ ๋ฐฐ๊ฒฝ์์๋ง alpha๊ฐ์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค.
๊ทผ๋ฐ,, ์์ง ๊ทธ๋ฆผ์๋ ์๋ค์ด๊ฐ๋ค. ์ด๋ ๊ฒ ๋ฐฐ๊ฒฝ์์ ์ฃผ๋ฉด ๋ ๊ฑฐ ๊ฐ๋ค.
๊ทธ๋ผ ๊ทธ๋ฆผ์๋ ๋๋์ฒด ์ ์์๊ธธ๊น? ์ด๋ ๊ฒ ์๊ฐ์ ํ๋ ์์ค, ๋ณด๋ผ์ ์ธ๋ชจ๋ฅผ ๋ฐ๊ฒฌํ๋ค. ์๋ ๋ณด๋ผ์ ์ ๊ตฌ์์!?
๋๊ฐ์ ๋ฒํผ์์ ๋ชจ๋ ๋ฐ์ํ๊ณ , ์๋ฌ๋ ๋ค์๊ณผ ๊ฐ์๋ค
โ ๏ธ The layer is using dynamic shadows which are expensive to render.
๊ทธ๋ฆผ์๋ ์ฃผ๋ณ์ ์์น?๋ฅผ ๊ณ์ฐํด์ ๋ด๋ณด๋ด์ผํ๊ธฐ ๋๋ฌธ์ ๋ ๋๋ง ๋น์ฉ์ด ๋ง์ด๋ ๋ค๊ณ ํ๋ค. shadowPath๋ก ๋ฐ๊ฟ๋ณด๋๊ฒ ์ด๋ป๋? ๋ผ๊ณ ๊ฒฝ๊ณ ๋ฅผ ์ค ๊ฒ์ด๋ค.
๐๐ป shadowPath๊ฐ ๋ญ์ง?
๋ณดํต ๊ทธ๋ฆผ์๋ฅผ ๊ตฌํํ ๋๋ CALayer์ ์๋ 5๊ฐ์ง ์์ฑ์ผ๋ก ๊ตฌํํ๋ค๊ณ ํ๋ค.
- shadowColor: ๊ทธ๋ฆผ์์ ์ง์ (๋ํดํธ ๊ฒ์ ์)
- shadowOpacity: ๊ทธ๋ฆผ์ ํฌ๋ช ๋ ์ง์ (0 ~ 1)
- shadowRadius: ๊ทธ๋ฆผ์์ ๋ธ๋ฌ ์ ๋ ์ง์ (0์ผ๋ ์ ๊ฐ์ด ์งํ ๊ทธ๋ฆผ์ ๋์ ์๋ก ํผ์ง๋ ํจ๊ณผ)
- shadowOffset: ๊ทธ๋ฆผ์์ ์์น(๊ธฐ๋ณธ 0,0 -> ๋ถ๋ชจ์ ์์น๋ฅผ ๋ฐ๋ผ๊ฐ)
- shadowPath: ๊ทธ๋ฆผ์์ ๋ชจ์์ ์ปค์คํ ๊ฐ๋ฅ (๋ํดํธ nil)
๋๋ ํ์ฌ, ์์ ๋ค๊ฐ์ง ์์ฑ์ ํ์ฉํด์ ๊ทธ๋ฆผ์๋ฅผ ๋ฃ์ด๋์์ง๋ง, ๋ณด๋ผ์ ์๋ฌ๊ฐ ๋ฌ๊ฒ! shadowPath๋ ๊ทธ๋ฆผ์์ ์ปค์คํ ์ด ๊ฐ๋ฅํด์, ๊ธฐ๋ณธ์ ์ผ๋ก shawdow๋ฅผ ๋ฃ์ผ๋ฉด
์ด๋ ๊ฒ ๋ทฐ ์๋์ ๊ฐ๋ฆฌ๋ ๊ทธ๋ฆผ์๊ฐ ๋๋๋ฐ, ์ด๊ฒ๋ง๊ณ ์ ์ฒด์ ์ธ ๊ทธ๋ฆผ์, ๋ฐ๊ณผ ์์ ์๊ธฐ๋ ๊ทธ๋ฆผ์ ๋ฑ ๋ค์ํ ๊ทธ๋ฆผ์์ ํํ๋ฅผ shadowPath๋ก ๋ง๋ค ์ ์๋ค. ์์ธํ ๊ฒ์ ์๋ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํด๋ณด์. ๊ต์ฅํ!!! ์ ์ค๋ช ๋์ด์๋ค. ๊ตฟ๊ตฟ
- ์ฐธ๊ณ - https://nsios.tistory.com/157
๐๐ป shadowPath๋ก custom ๊ทธ๋ฆผ์๋ฅผ ๋ง๋ค์.
๊ทธ๋ฅ ๋ฒํผ ์์ฒด์ ๊ทธ๋ฆผ์๋ฅผ custom ํด์ ๋ฃ์ด์ฃผ๋ ๋ฐฉ์์ด๋ค. ๋๋ ๋ฒํผ ์ ์ฒด์ ํฌ๊ธฐ๋งํผ ๊ทธ๋ฆผ์๋ฅผ ์์ฑํ์ด์ผ ํ๋ฏ๋ก, ๋ฒํผ์ ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํด์ ๊ทธ๋ฆผ์๋ฅผ ์์ฑํด์ฃผ์๋ค.
let buttonWidth = self.calculateButtonWidth(with: buttonTitle) + 10
let renderRect = CGRect(origin: .zero, size: CGSize(width: buttonWidth, height: Size.buttonHeigth))
self.layer.shadowPath = UIBezierPath(ovalIn: renderRect).cgPath
// width ๊ณ์ฐํ๋ ์ฝ๋ , height๋ ๊ณ ์ ๊ฐ์ด ์์! -> Size.buttonHeigth
private func calculateButtonWidth(with buttonTitle: String) -> CGFloat {
let label = UILabel()
label.text = buttonTitle
label.font = .font(.bold, ofSize: 16)
label.sizeToFit()
return label.frame.width + 28 + 44
}
์ด๋ ๊ฒ ์์ฑํ๋ค. ๋ฒํผ์ด ์ด๋ป๊ฒ ์๊ธฐ๋ , shadowPath๋ ๊ทธ๋ฅ ๊ทธ๋ฆผ์๋ฅผ ์์ฑํด์ฃผ๋ ์ฝ๋์๋ค.
์ด๋ ๊ฒ , ๋ฒํผ ์๋์ ๊ทธ๋ฆผ์๊ฐ ์๊ฒผ๋ค!!
โ ์ ๊น, ๋ฐฐ๊ฒฝ์ด ํฌ๋ช ์ด๋ ์๋๋ ๊ทธ๋ฅ ๊ทธ๋ฆผ์๋ฅผ ์์ฑํด์ฃผ๋๊ฑฐ๋ฉด, ์์์ copy(alpha: ) ๋ฅผ ์ ์ฉํด์ฃผ์ง ์๊ณ , ๊ทธ๋ฅ ๋ฒํผ ๋ฐฐ๊ฒฝ์์ฒด๋ฅผ UIColor(hex: “#FFFFF”, alpha: 0.14)๋ก ์ ์ฉํด๋ ๋์ง ์์๊น? ํ๋ ์๋ฌธ์ด ์๊ฒผ๋ค. ๋ฐ๋ก ์ ์ฉํด๋ณด์…
์ญ์!!!
copy๋ฅผ ์ฌ์ฉํ๋ฉด, CGColor๋ฅผ UIColor๋ก ๋ณ๊ฒฝํด์ฃผ๋ ๊ณผ์ ์ด ํ์ํ๊ณ , ๊ทธ ๊ณผ์ ์์ optional unwrapping์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ์ฐ์ฐํ๋๋ฐ, ๊ทธ๋ฅ UIColor์ alpha๊ฐ์ ์กฐ์ ํด์ค ๊ฒ์ ์ฌ์ฉํ๋๊ฒ ๋ ํจ์จ์ ์ด๊ณ ์์ ํ๋ค๊ณ ํ๋จํ๋ค. ๊ทธ๋ฆฌ๊ณ , ๋ฌด์๋ณด๋ค ๋ณด๋ผ์ ์ ๊ตฌ๋ฅผ ์์ ์ฃผ๋ shadowPath๋ฅผ ์ฌ์ฉํ์ผ๋, renderํ๋๋ฐ๋ ๋ถ๋ด์ด ์๋๊ณ !!
์ต์ข ๊ฒฐ๊ณผ๋ฌผ ์ง์ ๐
์,, ๋ฒํผ์ด ์ ๋ง,, ๋๋ฅผ ์ ๋จน์ธ๋ค. ์ง๋๋ฒ์๋ ๋ฒํผ์ด๋ ์ ์์น๋ฃจ๋๋ผ ํ๋ค์๋๋ฐ ใ
ใ
ใ
ใ
์ค๋์ shadow๋ ์ด์ฌํ ๋์๋ณธ ํ๋ฃจ์๋ค. ,,, ์ฌ๊ธฐ ๋ด๋ถ์์๋ ์์๋ณผ ๊ฐ๋
์ด ๋ฌด์ํ ๋ง์ง๋ง,,, ์ด๋ ๊ฒ ๋ค์ํ ๋ฐฉ์์ผ๋ก ํฌ๋ช
๋๋ฅผ์ค ์ ์๋ค๋ผ๋ ์ ์ ๋ฐฐ์๊ฐ๋ค. ํ์ดํ
!! ๐ป