์ฐ์ ๊ตฌํํ ๋ฐฑ์ ๋ฐ ๋ณต๊ตฌ ํ๋ฉด์ ์๋์ ๊ฐ๋ค!
(์๋ฎฌ๋ ์ดํฐ๋ฅผ ์๊พธ ๋๋ฆฌ๋ค ๋ณด๋ ์๊ฒ ๋ ์ฌ์ค ํ ๊ฐ์ง.. iOS 16 ๋ฏธ๋ง์ ์๋ฎฌ๋ ์ดํฐ์์๋ home indicator์ ์ค๋ฅธ์ชฝ ๋ถ๋ถ์ด ํ๋ฆฌ๋ค….๊ฑฐ์ฌ๋ฆผ)
์ ํ๋ฉด์ ์์๋ก, View์ ๊ด๋ จํ์ฌ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ธฐ ์ํด ๊ณ ๋ฏผํ๊ณ ๊ตฌํํ๋ ์ง์ ๋ค ์ค ๋ ๊ฐ์ง๋ฅผ ์ ์ด ๋ณด๋ ค ํ๋ค..!
Custom View with Parameters
์ ํ๋ฉด์ ๋ณด์ด๋ ๊ฒ๊ณผ ๊ฐ์ด ๋ฐฑ์
ํ๊ธฐ ๋ฒํผ๊ณผ ๋ถ๋ฌ์ค๊ธฐ ๋ฒํผ์ ๋์์ธ์ด ๋์ผํ๋ฏ๋ก,
์ปค์คํ
๋ฒํผ BackupAndRestoreButton์ ๋ง๋ค๊ณ
๋ฐฑ์
ํ๊ธฐ ๋ฒํผ๊ณผ ๋ถ๋ฌ์ค๊ธฐ ๋ฒํผ์ ๊ฐ๊ฐ ์ด BackupAndRestoreButton์ ์ธ์คํด์ค๋ก ์์ฑํ์๋ค.
class BackupAndRestoreButton: UIButton {
// MARK: - Properties
var title: String?
// MARK: - Initializers
init(title: String) {
self.title = title
super.init(frame: .zero)
setUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
setUI() ๋ฉ์๋๊ฐ ๊ธธ์ด ์ ์ฝ๋์์๋ ์๋ตํ์ง๋ง,
๊ณตํต๋๋ ๋ถ๋ถ(์ฌ๊ธฐ์๋ ๋์์ธ)์ ํ๋์ ํด๋์ค ๋ด์ ๊ตฌํํ๊ณ , ์ธ์คํด์ค๋ฅผ ๋ง๋ค ๋๋ง๋ค ๋ฌ๋ผ์ง๋ ๋ถ๋ถ(์ฌ๊ธฐ์๋ ๋ฒํผ์ ํ์ดํ)์ ๋ฐ๋ก ๊ตฌํํ ์ ์๋๋ก ๋ฏธ๋ฆฌ ์ค์ ํด ๋์๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค!
๋๋ setUI()์ ๊ณตํต ๊ตฌํ๋ถ๋ฅผ ์์ฑํ๊ณ , initializer์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์จ ๋ฒํผ ํ์ดํ๋ setUI()์์ ์ฒ๋ฆฌ๋ ์ ์๋๋ก ํ๋ค. ๋ฒํผ ๋์์ธ์ ๋ฉ์๋ ๋ด ์ ์ธ๋ UIButton.Configuration ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํ๊ธฐ ๋๋ฌธ์, title ๋ํ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ํตํด ๋ํ๋ผ ์ ์๋๋ก ํ๊ธฐ ์ํจ์ด๋ค! (์๋ ‘UIButton.Configuration์ ์ฌ์ฉํ๋ UIButton์ ํ์ดํ์ ํฐํธ ์ ์ฉํ๊ธฐ’ ์ฐธ๊ณ )
// BackupAndRestoreView.swift
let backupButton = BackupAndRestoreButton(title: Notice.backup)
let importBackupFileButton = BackupAndRestoreButton(title: Notice.bring)
์์ฒ๋ผ ์ปค์คํ Button ํด๋์ค๋ฅผ ์์ฑํ๋ฉด, ํด๋น ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋๋ง๋ค ํ์ดํ๋ง ์ง์ ํ๋ฉด
์ด๋ ๊ฒ ๊ฐ์ ๋์์ธ์ ๋ฒํผ ์ฌ๋ฌ ๊ฐ๋ฅผ ์์๊ฐ์ ๋๋ฑ..! ๋ง๋ค์ด ๋ผ ์ ์๋ค!
์ง๊ธ์ 2 ๊ฐ ๋ฟ์ด์ง๋ง, ๊ฐ์ฒด ์๊ฐ ๋ ๋ง์ด ํ์ํ ์๋ก ์ด๋ฌํ ์ปค์คํ
UI ํด๋์ค์ ํ์์ฑ๊ณผ ์ฅ์ ์ ๋ ๋ง์ด ์ฒด๊ฐํ ์ ์์ ๊ฒ ๊ฐ๋ค.
๋ 2 ๊ฐ๋ง์ผ๋ก๋ ๋ง์ด ์ฒด๊ฐํ๋๋ฐ, ์ด ๋ ๊ตฌํํ ๊ณตํต๋ถ๋ ์๋ ๊ธ์์ ํ์ธํ ์ ์๋ค.
UIButton.Configuration์ ์ฌ์ฉํ๋ UIButton์ ํ์ดํ์ ํฐํธ ์ ์ฉํ๊ธฐ
(์๋ ๋๋ณด๊ธฐ ํด๋ฆญ)
iOS 15 ์ด์์ ๋์ํ๋ฉด์ UIButton.Configuration์ผ๋ก ๋ชจ๋ ๋ฒํผ์ ๋์์ธ์ ํ๊ณ ์๋๋ฐ,
์ด Configuration์๋ ๋ฐ๋ก font ํ๋กํผํฐ๊ฐ ์กด์ฌํ์ง ์์๋ค.
๋ฐฑ์
ํ๊ธฐ ๋ฒํผ๊ณผ ๋ถ๋ฌ์ค๊ธฐ ๋ฒํผ ํ์ดํ์ ํฐํธ ์ ์ฉ์ AttributeContainer์ font ํ๋กํผํฐ์ ํฐํธ๋ฅผ ์ง์ ํ๊ณ ,
Configuration์ attributedTitle ํ๋กํผํฐ์์
AttributeContainer์ attributes์ AttributeContainer๋ฅผ ์ง์ ํจ์ผ๋ก์จ ํด๊ฒฐํ ์ ์์๋ค.
์ BackupAndRestoreButton์ ์๋ต๋ setUI() ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
// MARK: - Design Methods
private func setUI() {
guard let title = title else {
print("No title for BackupAndRestoreButton")
return
}
var container = AttributeContainer()
container.font = .meringue(size: 15)
container.foregroundColor = .label
var buttonConfiguration = UIButton.Configuration.filled()
buttonConfiguration.baseBackgroundColor = .systemBackground
buttonConfiguration.attributedTitle = AttributeContainer(title, attributes: container)
configuration = buttonConfiguration
addShadows()
}
private func addShadows() {
addShadow(radius: 12, opacity: 0.2) // ์๋ 'UIView+Extension์ผ๋ก ๊ทธ๋ฆผ์ ๊ตฌํ์ ๋น ๋ฅด๊ฒ ํ๊ธฐ' ์ฐธ๊ณ
}
UIView+Extension์ผ๋ก ์ฌ์ฌ์ฉ์ ํ์ฉํด ๊ทธ๋ฆผ์ ๊ตฌํ์ ๋น ๋ฅด๊ฒ ํ๊ธฐ
๋งค๋ฒ 4์ค์ฉ ์ ์ด์ผ ๊ทธ๋ฆผ์๋ฅผ ๊ทธ๋ฆด ์ ์๋ ๋ฒ๊ฑฐ๋ก์์ ์ค์ด๊ณ ์ extension์ผ๋ก ๋ฉ์๋๋ฅผ ๋ง๋ค์๋ค.
UIView์ extension์ ์๋์ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ ์ธํด ๋์ผ๋ฉด,
UIImageView, UIButton๊ณผ ๊ฐ์ด UIView๋ฅผ ์์๋ฐ๋ ๊ฐ์ฒด๋ค์์ ์ด ๋ฉ์๋๋ก ๊ทธ๋ฆผ์๋ฅผ ๊ทธ๋ฆด ์ ์๋ค!
extension UIView {
func addShadow(radius: CGFloat, opacity: Float) {
layer.shadowColor = UIColor.tintColor.cgColor
layer.shadowOffset = .zero
layer.shadowRadius = radius
layer.shadowOpacity = opacity
}
}
์ด๋ ๊ฒ UIImageView์์๋ ๊ฐ๋ฅํ๊ณ
let cloudImageView = UIImageView().then {
$0.contentMode = .scaleAspectFit
$0.image = UIImage(systemName: SFSymbol.cloudFill)
$0.tintColor = .white
// $0.layer.shadowColor = UIColor.tintColor.cgColor
// $0.layer.shadowOffset = .zero
// $0.layer.shadowRadius = 60
// $0.layer.shadowOpacity = 0.4
// ↓ !!!
$0.addShadow(radius: 60, opacity: 0.4)
}
UITableView์์๋ ๊ฐ๋ฅํ๋ค.
let tableView = UITableView(frame: .zero, style: .insetGrouped).then {
$0.register(BackupFileTableViewCell.self, forCellReuseIdentifier: BackupFileTableViewCell.reuseIdentifier)
$0.backgroundColor = .clear
$0.addShadow(radius: 12, opacity: 0.2)
}
extension์ผ๋ก ๊ตฌํ๋ ๋ฉ์๋๋ ์๋ธํด๋์ค์์๋ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ ๋ํ ์ ์ ์๋ค..!
'๐งฏ Troubleshooting' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ฃผ์์์ ์ํํธ ๋, ํธ๋ง ์ถ์ถํด๋ด๊ธฐ (0) | 2024.11.22 |
---|---|
[Cheliz] Pagination (+ API ํต์ ) (0) | 2023.02.09 |
[Cheliz] UITabBarItem์ SF Symbol ์ฌ์ด์ฆ ์กฐ์ Issue (0) | 2023.02.09 |
[Cheliz] Realm ์ค๋ณต ์ถ๊ฐ ๋ฐฉ์ง (0) | 2023.02.09 |
[Cheliz] UICollectionView leading/trailingSwipeActions - Realm Read/Delete (0) | 2023.02.09 |