🍎 iOS & Swift

[iOS] μ½”λ“œλ‘œ UI κ΅¬μ„±ν•˜κΈ° - Then 라이브러리 do λ©”μ„œλ“œ 이용

taeeekki 2022. 8. 22. 01:47

μš”μƒˆ λ‹€μ‹œ μ½”λ“œ 베이슀둜 UIλ₯Ό 짜고, ν”„λ‘œκ·Έλž˜λ°μ„ ν•˜κ³  μžˆλ‹€. μ†νŠΈ μ„Έλ―Έλ‚˜ ν•  λ•Œ μŠ€ν† λ¦¬λ³΄λ“œλ₯Ό λ„ˆλ¬΄ 많이 λ΄€λŠ”μ§€ μž μ‹œ 멀리 ν•  λ•Œκ°€ 된 것 κ°™λ‹€λŠ” 생각을 슀슀둜 ν–ˆλ‹€... μΆ©λΆ„νžˆ 많이 λ΄€μ–΄...πŸ‘‹ 사싀 μ½”λ“œ 베이슀둜 UIλ₯Ό μ§€ λ•Œ 항상 고민을 ν–ˆλ˜ 뢀뢄은 μ½”λ“œκ°€ λ„ˆλ¬΄ κΈΈμ–΄μ§€κ³  가독성이 μ’‹μ§€ μ•Šλ‹€λŠ” κ²ƒμ΄μ—ˆλ‹€.

 

μƒˆμ‹Ή 과제인 Diary 앱을 λ§Œλ“€λ©΄μ„œ 문득 또 생각이 λ“€μ–΄μ„œ μŠ€νƒ€μΌμ„ μ’€ λ°”κΎΈλ €κ³  μ‹œλ„ν•΄λ³΄μ•˜λ‹€.

 


 

Then (Syntax Sugar Library)λ₯Ό μ‚¬μš©ν•œλ‹€λŠ” κ°€μ • ν•˜μ— UI μ§œλŠ” μŠ€νƒ€μΌμ„ ν•œ 번 μ‚΄νŽ΄λ³΄μž.

 


 

1. μΈμŠ€ν„΄μŠ€ 생성 μ‹œμ— ν΄λ‘œμ €λ‘œ μ†μ„±κΉŒμ§€ μ§€μ •ν•΄μ£ΌλŠ” 방법

UI 객체가 λͺ‡ 개 μ—†λ‹€λ©΄ 였히렀 κΉ”λ”ν•˜κ³  가독성도 쒋은 것 κ°™λ‹€.

let blackView = UIView().then {
    $0.backgroundColor = .black
}

let nameLabel = UILabel().then {
    $0.text = "text"
    $0.textColor = .blue
    $0.backgroundColor = .red
}

override func viewDidLoad() {
    super.viewDidLoad()
	
    configureLayout()
}

private func configureLayout() {
    [blackView, nameLabel].forEach {
        view.addSubview($0)
    }

    blackView.snp.makeConstraints {
        $0.width.height.equalTo(200)
        $0.top.equalTo(view.safeAreaLayoutGuide)
        $0.centerX.equalTo(view)
    }

    nameLabel.snp.makeConstraints {
        $0.edges.equalTo(blackView).inset(50)
    }
}

 

 

2. 속성을 λ©”μ„œλ“œμ—μ„œ 직접 ν•΄μ£ΌλŠ” 방법

속성을 객체 λ³„λ‘œ λ©”μ„œλ“œλ₯Ό λ‚˜λˆ„μ–΄ μ§€μ •ν•˜λŠ” 방법(- 넀이밍 ν•˜λŠ” 것도 머리 μ•„ν”„λ‹€ -)도 있고, μ˜ˆμ‹œμ—λŠ” configureAttributes λ©”μ„œλ“œ μ•ˆμ— 속성 μ„€μ •ν•˜λŠ” μ½”λ“œλ₯Ό μ „λΆ€ λ•Œλ €λ°•μ•˜λ‹€. 벌써 λ³„λ‘œμΈ 것 κ°™λ‹€. 속성 ꡬ뢄도 μ•ˆ 되고 가독성이 λ³„λ‘œ μ’‹μ§€ μ•Šλ‹€. (UI μš”μ†Œκ°€ 더 λ§Žμ•„μ§€λŠ” 상황을 μƒκ°ν•΄λ³΄μž.)

let blackView = UIView()
let nameLabel = UILabel()

override func viewDidLoad() {
    super.viewDidLoad()
    
    configureAttributes()
    configureLayout()
}

private func configureAttributes() {
	
    blackView.backgroundColor = .red
    nameLabel.text = "text"
    nameLabel.textColor = .blue
    nameLabel.backgroundColor = .red
}

private func configureLayout() {
    [blackView, nameLabel].forEach {
        view.addSubview($0)
    }

    blackView.snp.makeConstraints {
        $0.width.height.equalTo(200)
        $0.top.equalTo(view.safeAreaLayoutGuide)
        $0.centerX.equalTo(view)
    }

    nameLabel.snp.makeConstraints {
        $0.edges.equalTo(blackView).inset(50)
    }
}

 


 

μœ„μ—μ„œ μ‚΄νŽ΄λ³Έ 두 κ°€μ§€μ˜ μŠ€νƒ€μΌμ€ μ–΄λ– ν•œκ°€? 사싀 μ–΄λ–€ 방법을 μ‚¬μš©ν•  κ²ƒμΈμ§€λŠ” μ·¨ν–₯ 차이인 것 κ°™λ‹€. λ§Žμ€ λ ˆν¬μ§€ν„°λ¦¬λ₯Ό μ‚΄νŽ΄λ³΄λ©΄ μ „μžλ₯Ό 많이 μ‚¬μš©ν•˜λŠ” 것 같은데 UI μΈμŠ€ν„΄μŠ€ μˆ˜κ°€ μ‘°κΈˆμ΄λΌλ„ λ§Žμ•„μ§€λ©΄ μƒλ‹Ήνžˆ 가독성이 λ³„λ‘œλΌκ³  λŠκ»΄μ§„λ‹€. (개인적인 생각) - RootView만 λœ―μ–΄μ„œ λ”°λ‘œ UIλ₯Ό κ΅¬μ„±ν•˜λŠ” 방식을 μ μš©ν•œλ‹€κ³  ν•˜λ”λΌλ„ 같은 λ¬Έμ œμ μ€ κ·ΈλŒ€λ‘œ μžˆλ‹€. λ‚˜λŠ” UI μΈμŠ€ν„΄μŠ€κ°€ μ­‰ κ°€μ§€λŸ°ν–ˆμœΌλ©΄ μ’‹κ² μ–΄μ„œ ν›„μžμ˜ 방법에 Then 라이브러리의 do λ©”μ„œλ“œλ₯Ό μ΄μš©ν•΄λ³΄κΈ°λ‘œ ν–ˆλ‹€. (맨날 Then λ©”μ„œλ“œλ§Œ μ“°λ‹€λ³΄λ‹ˆκΉŒ λ‹€λ₯Έ λ©”μ„œλ“œκ°€ μžˆλŠ”μ§€λ„ λͺ°λžλ‹€.)

 


λ‹€μŒκ³Ό 같은 λ ˆμ΄μ•„μ›ƒμ„ κ΅¬μ„±ν•œλ‹€κ³  κ°€μ •ν•˜κ³  보도둝 ν•˜μž.

 


 

Then 라이브러리의 do λ©”μ„œλ“œ 이용

UI ν”„λ‘œνΌν‹°μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€ λ•Œ μ†μ„±κΉŒμ§€ ν•œ λ²ˆμ— μ§€μ •ν•΄μ€¬μ—ˆλŠ”λ° μ½”λ“œκ°€ μ’€ μ§€μ €λΆ„ν•΄μ§€κ³ , UI μš”μ†Œλ§Œ λΆ„λ¦¬μ‹œμΌœμ„œ 보고 μ‹Άλ‹€λŠ” 생각이 계속 λ“€μ—ˆμ—ˆλ‹€. κ·Έλ ‡λ‹€κ³  속성을 ν•˜λ‚˜μ˜ λ©”μ„œλ“œ μ•ˆμ—μ„œ μ­‰ μ μ–΄μ£Όμžλ‹ˆ 그것도 가독성이 μ’‹μ§€ μ•Šμ•˜λ‹€. Then 라이브러리의 do λ©”μ„œλ“œ μ΄μš©ν•΄λ³΄κΈ°λ‘œ ν–ˆλ‹€.

 

μ΄λ ‡κ²Œ μž‘μ„±ν•˜κ³  λ‚˜λ‹ˆ ν›„μž(속성을 λ©”μ„œλ“œμ—μ„œ 직접 ν•΄μ£ΌλŠ” 방법)의 λ¬Έμ œμ μ΄μ—ˆλ˜ 가독성이 μ•ˆ μ’‹λ‹€λŠ” 것이 μ’€ ν•΄κ²°λœ λ“― ν•˜λ‹€. 그리고 μ›ν–ˆλ˜ κ²ƒμ²˜λŸΌ UI μΈμŠ€ν„΄μŠ€λ₯Ό κ°€μ§€λŸ°νžˆ λ³Ό 수 있게 λ˜μ—ˆλ‹€.

final class PhotoSearchView: BaseView {
    
    lazy var searchBar = UISearchBar()
    lazy var collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewLayout())
    
    override func configureAttributes() {
        
        searchBar.do {
            $0.placeholder = "사진을 κ²€μƒ‰ν•΄λ³΄μ„Έμš”."
            $0.searchTextField.font = .systemFont(ofSize: 14)
            $0.searchTextField.backgroundColor = .clear
        }
        
        collectionView.do {
            $0.register(PhotoCell.self, forCellWithReuseIdentifier: PhotoCell.reuseIdentifier)
            
            let layout = UICollectionViewFlowLayout()
            let spacing = 8.0
            let cellWidth = (UIScreen.main.bounds.width - spacing * 2) / 3
            layout.itemSize = CGSize(width: cellWidth, height: cellWidth)
            layout.minimumInteritemSpacing = spacing
            $0.collectionViewLayout = layout
        }
    }
    
    ...
}

 


 

마무리

였늘 μž‘μ„±ν•œ λ‚΄μš©μ€ 정말 개인적인 μ·¨ν–₯, 생각이기 λ•Œλ¬Έμ— 참고만 ν–ˆμœΌλ©΄ μ’‹κ² λ‹€. μ½”λ“œ μž‘μ„± μŠ€νƒ€μΌμ€ 개인 μ·¨ν–₯μ΄λ‹ˆκΉ!