[UIKit] CustomView

2023. 11. 30. 19:19ยท๐ŸŽ Dev/UIKit

 
 
 
 

์ƒˆ์‹น์—์„œ ํ›„๋ฐ˜๊ธฐ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐœ๋ฐœํ•  ๋‹น์‹œ CustomView๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์–ด์„œ ์ •๋ฆฌํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.
์ฃผ๋กœ ์ฝ”๋“œ๋ฒ ์ด์Šค๋กœ UI๋ฅผ ๊ทธ๋ ค์™”๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๊ธ€์—์„  ์ฝ”๋“œ ๋ฒ ์ด์Šค + SnapKit ๊ธฐ๋ฐ˜์œผ๋กœ customView๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃฐ ์˜ˆ์ •์ด๋‹ค.
 
 
 
 
 

์ถœ์ฒ˜: ๋‚ด๊ฐ€ ํ•œ LSLP ํ”„๋กœ์ ํŠธ ์ค‘ ํšŒ์›๊ฐ€์ž…-๋กœ๊ทธ์ธ UI ์บก์ณ

 
 
 

์ปค์Šคํ…€ ๋ทฐ๋ฅผ ์™œ ์‚ฌ์šฉํ• ๊นŒโ“

 
์šฐ์„  ๋‚ด๊ฐ€ CustomView๋ฅผ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฐ€์žฅ ํฐ ์ด์œ ๋Š” ์žฌ์‚ฌ์šฉ์„ฑ ๋•Œ๋ฌธ์ด์—ˆ๋‹ค.
์œ„ ์บก์ณ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ, ๋ฐ˜๋ณต๋˜๋Š” UI ์š”์†Œ๊ฐ€ ๋งŽ์€ ํ™”๋ฉด์„ ๊ทธ๋ฆด ๋•Œ ๋งค๋ฒˆ UI์™€ ๊ด€๋ จ๋œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๊ต‰์žฅํžˆ ๋น„ํšจ์œจ์ ์ผ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.
 
ํฐํŠธ๋ฅผ ๋ฐ”๊ฟ”์•ผํ•œ๋‹ค๋ฉด?
ํฌ์ธํŠธ ์ปฌ๋Ÿฌ๋ฅผ ๋ฐ”๊ฟ”์•ผํ•œ๋‹ค๋ฉด?
๋ฒ„ํŠผ์˜ ์ฝ”๋„ˆ ๋ ˆ๋””์–ด์Šค๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•œ๋‹ค๋ฉด?
 
๋™์ผํ•œ ๊ตฌ์„ฑ์˜ ์ฝ”๋“œ๋ฅผ ์ผ์ผ์ด ์ฐพ์•„์„œ ์ˆ˜์ •ํ•œ๋‹ค๋ฉด, ๋ฐ˜๋ณต๋˜๋Š” ๋ทฐ์˜ ์ˆ˜๊ฐ€ ๋งŽ์„ ์ˆ˜๋ก ์ˆ˜์ •์˜ ๊ตด๋ ˆ์— ๋น ์งˆ ์ˆ˜ ๋ฐ–์— ์—†์œผ๋‹ˆ๊นŒ.
 
๋˜ํ•œ, ๋ถ€๋ถ„์ ์œผ๋กœ ๋‹ค๋ฅธ ๋ทฐ์—์„œ๋„ ๊ฐ™์€ UI๋ฅผ ๊ทธ๋ ค์•ผํ•  ๋•Œ๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿด ๋•Œ ํ•ด๋‹น UI ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋ ค๋ฉด CustomView ์‚ฌ์šฉ์ด ์ ์ ˆํ–ˆ๋‹ค.
 
 
 
 
 
 
 

โœ”๏ธŽ ์ปค์Šคํ…€ ๋ทฐ๋ฅผ ํ™œ์šฉํ•˜๊ธฐ

 
1. ๋ฒ„ํŠผ ์žฌ์‚ฌ์šฉ
 

import UIKit

class NextButton: UIButton {
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setting()
        
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    func setting() {
        setTitleColor(.white, for: .normal)
        backgroundColor = ConstantColor.inActiveBrand
        layer.cornerRadius = 8
        titleLabel?.font = ConstantTypo.title2
        
    }
    
    
}

 
ํšŒ์›๊ฐ€์ž…์„ ํ•  ๋•Œ, ๋‹ค์Œ ๋ฒ„ํŠผ์„ ๋งŒ๋“ค ๋•Œ UI๊ฐ€ ๋™์ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ปค์Šคํ…€๋ทฐ๋กœ ๊ด€๋ฆฌํ–ˆ๋‹ค.
 
init(frame: CGRect) ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์ž๋™์œผ๋กœ required init?(coder: NSCoder) ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋„๋ก ์ปดํŒŒ์ผ ์‹œ์ ์— ์•ˆ๋‚ด๊ฐ€ ๋œฌ๋‹ค.
 
๋‘ ๊ฐ€์ง€๋ฅผ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•˜์ž๋ฉด, 
 
init(frame:)์€ ์ฝ”๋“œ๋กœ ๋ทฐ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ์˜ ์ƒ์„ฑ์ž์ด๊ณ ,
init(coder:)๋Š” ์Šคํ† ๋ฆฌ๋ณด๋“œ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ทฐ๊ฐ€ ์ƒ์„ฑ ๋  ๋•Œ์˜ ์ƒ์„ฑ์ž์ด๋‹ค.
 
๋‚˜๋Š” ์ฝ”๋“œ๋กœ ๋ทฐ๋ฅผ ๊ทธ๋ฆฌ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, init(frame:)์—๋งŒ ๋‚ด๊ฐ€ ์žฌ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ณ ์ • UI ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ–ˆ๋‹ค.
 

let nextButton: UIButton = {
   let btn = NextButton()
   btn.setTitle("์›Œํฌ์ŠคํŽ˜์ด์Šค ์ƒ์„ฑ", for: .normal)
   return btn
}()

 
์ปค์Šคํ…€์œผ๋กœ ๋งŒ๋“  ๋ฒ„ํŠผ์€ ์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋กœ ๋ถˆ๋Ÿฌ์™€ ์ ์šฉํ•˜๋ฉด ๋œ๋‹ค.
 
 
 
2. ๋ทฐ ์žฌ์‚ฌ์šฉ
 
๋ทฐ ์ž์ฒด๊ฐ€ ๋ฐ˜๋ณต๋˜๋Š” UI๊ฐ€ ๋งŽ์•˜๋˜ SLP ๋ทฐ๋ฅผ ๊ทธ๋ฆฌ๋ฉฐ CustomView ์‚ฌ์šฉ์„ ํ™•์žฅํ•ด๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
๋‚˜๋Š” UI ์š”์†Œ ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ CustomView๋กœ ๋งŒ๋“ค์–ด ๊ด€๋ฆฌ๋ฅผ ํ•ด์™”์—ˆ๋Š”๋ฐ, ์ด ํ”„๋กœ์ ํŠธ ์ดํ›„ ๋ฐ˜๋ณต๋˜๋Š” view ์ž์ฒด๋ฅผ custom์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.
 
 

import UIKit
import SnapKit

final class ListView: UIView {
    
    let customButton = {
        let btn = UIButton()
        return btn
    }()
    
    let iconImageView = {
        let view = UIImageView()
        view.image = ConstantIcon.hashThin
        return view
    }()
    
    let titleLabel = {
        let label = UILabel()
        label.font = ConstantTypo.body
        label.textColor = UIColor.textSecondary
        return label
    }()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        configureViews()
        setConstraints()

    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    func configureViews() {
        addSubview(iconImageView)
        addSubview(titleLabel)
        addSubview(customButton)

    }
    
    func setConstraints() {
        
        iconImageView.snp.makeConstraints { make in
            make.leading.equalToSuperview().offset(14)
            make.size.equalTo(18)
            make.centerY.equalToSuperview()
        }
        
        titleLabel.snp.makeConstraints { make in
            make.leading.equalTo(iconImageView.snp.trailing).offset(16)
            make.height.equalTo(28)
            make.width.equalTo(290)
            make.centerY.equalTo(iconImageView)
        }
        
        customButton.snp.makeConstraints { make in
            make.edges.equalToSuperview()
        }
        
        
    }
}

 
 
customView ๋‚ด์—์„œ ๊ธฐ๋ณธ ๋ ˆ์ด์•„์›ƒ์„ ์žก์•„๋‘˜ ์ˆ˜ ์žˆ๋‹ค.
์ฐพ์•„๋ณด๋‹ˆ frame์„ ์‚ฌ์šฉํ•ด์„œ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋Š”๋ฐ, ์ผ๋‹จ ๋‚˜๋Š” snapKit ์‚ฌ์šฉ์ด ์ต์ˆ™ํ•ด์„œ ๋‚ด๊ฐ€ ํ•˜๋˜ ๋ฐฉ์‹๋Œ€๋กœ ์ž‘์„ฑํ–ˆ๋‹ค.
 
 

let guideView = {
      let view = ListView()
      view.iconImageView.image = ConstantIcon.helpCustom
      view.titleLabel.text = "๋„์›€๋ง"
      return view
}()

 

์ปค์Šคํ…€์œผ๋กœ ๋งŒ๋“  ListView๋„ ์œ„์ฒ˜๋Ÿผ ์ƒ์†ํ•ด์„œ ํ•„์š”์— ๋”ฐ๋ผ ๋‚ด๋ถ€ UI๋ฅผ ์ˆ˜์ •ํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
 
 
 

โœ”๏ธŽ ๋งˆ๋ฌด๋ฆฌ: ์ปค์Šคํ…€ ๋ทฐ ์‚ฌ์šฉ์˜ ์žฅ์ 

 
์ด๋ ‡๊ฒŒ ๋ฐ˜๋ณต๋˜๋Š” UI ์ฝ”๋“œ๋ฅผ ํด๋ž˜์Šค๋กœ ์ปค์Šคํ…€๋ทฐ๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋ฉด view์—์„œ์˜ ์ฝ”๋“œ๊ฐ€ ํ™•์‹คํžˆ ์ค„์–ด์žˆ๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
 
 

์ €์ž‘์žํ‘œ์‹œ

'๐ŸŽ Dev > UIKit' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[UIKit] ์•ฑ์˜ ์ƒ๋ช…์ฃผ๊ธฐ  (0) 2023.11.27
[UIKit] Font ์„ค์ •ํ•˜๊ธฐ  (0) 2023.11.02
[UIKit/Storyboard] ํ‚ค๋ณด๋“œ ๋‚ด๋ฆฌ๊ธฐ  (0) 2023.07.30
[UIKit/Storyboard] ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ๋‹ค๋ฅธ ์Šคํ† ๋ฆฌ๋ณด๋“œ ๋ณด๋Š” ๋ฒ•  (0) 2023.07.30
[UIKit/Storyboard] ์•„์šธ๋ › ํ•จ์ˆ˜ (@IBOutlet)๊ณผ ์•ก์…˜ ํ•จ์ˆ˜ (@IBAction)  (0) 2023.07.29
'๐ŸŽ Dev/UIKit' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [UIKit] ์•ฑ์˜ ์ƒ๋ช…์ฃผ๊ธฐ
  • [UIKit] Font ์„ค์ •ํ•˜๊ธฐ
  • [UIKit/Storyboard] ํ‚ค๋ณด๋“œ ๋‚ด๋ฆฌ๊ธฐ
  • [UIKit/Storyboard] ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ๋‹ค๋ฅธ ์Šคํ† ๋ฆฌ๋ณด๋“œ ๋ณด๋Š” ๋ฒ•
Callie_
Callie_
  • Callie_
    CalliOS
    Callie_
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ
      • ๐ŸŽ APPLE
      • ๐ŸŽ Dev
        • Swift
        • UIKit
        • SwiftUI
        • Issue
        • ๊ตฌํ˜„
      • ๐ŸŽ Design
        • HIG
      • โš™๏ธ CS
      • ๐Ÿ’ก ์•Œ๊ณ ๋ฆฌ์ฆ˜
        • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
        • ๋ฐฑ์ค€
      • ๐ŸŸ๏ธ ์ง๊ด€๋กœ๊ทธ (์ถœ์‹œ์•ฑ)
        • ์—…๋ฐ์ดํŠธ
      • ๐ŸŒฑ SeSAC iOS 3๊ธฐ
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    .fullScreen
    layer.shadow
    SwiftUI
    clipsToBound
    CocoaTouchFramework
    DiffableDataSource
    .OverFullScreen
    TapGestureRecognizer
    apply
    Snapshot
    IBAction
    SeSAC
    modalPresentStyle
    Swift
    ์ƒ๋ช…์ฃผ๊ธฐ
    DidEndOnExit
    TableViewCell
    Infoํƒญ
    cornerradius
    ios
    addTarget
    assets
    IBOutlet
    diffable
    CustomView
    Entry Point
    ํ™”๋ฉด์ „ํ™˜
    stroyboard
    ๋„คํŠธ์›Œํฌํ†ต์‹ 
    Enum
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Callie_
[UIKit] CustomView
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”