์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

ํ—ท๊ฐˆ๋ฆฌ๋Š” UIKit ์†์„ฑ๊ณผ SnapKit ์ œ์•ฝ ์†์„ฑ

๐ŸŽ iOS/UIKit

by AHN.Jihyeon 2024. 6. 27. 23:50

๋ณธ๋ฌธ

UIView ์†์„ฑ๋“ค

์†์„ฑ ์„ค๋ช…
backgroundColor ๋ทฐ์˜ ๋ฐฐ๊ฒฝ์ƒ‰์„ ์„ค์ •
isHidden ๋ทฐ์˜ ์ˆจ๊น€ ์—ฌ๋ถ€๋ฅผ ์„ค์ •
alpha ๋ทฐ์˜ ํˆฌ๋ช…๋„๋ฅผ ์„ค์ •
clipsToBounds ํ•˜์œ„ ๋ทฐ๊ฐ€ ๋ฒ—์–ด๋‚˜๋Š” ์˜์—ญ์„ ์ž˜๋ผ๋‚ผ์ง€ ์—ฌ๋ถ€๋ฅผ ์„ค์ •
layer ๋ทฐ์˜ ์ฝ˜ํ…์ธ  ๋ ˆ์ด์–ด์— ๋Œ€ํ•œ ์„ค์ •์„ ๊ด€๋ฆฌ (ex: ๊ทธ๋ฆผ์ž, ํ…Œ๋‘๋ฆฌ ์„ค์ • ๋“ฑ)
let view = UIView()

view.backgroundColor = .blue
view.isHidden = false
view.alpha = 0.5
view.clipsToBounds = true
view.layer.cornerRadius = 10

 

 

 

UIButton ์†์„ฑ๋“ค

UIButton ํด๋ž˜์Šค๋Š” UIView ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์œผ๋ฉฐ, ์ถ”๊ฐ€์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์†์„ฑ๋“ค์„ ์ดˆ๊ธฐ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์†์„ฑ ์„ค๋ช…
setTitle(_:for:) ๋ฒ„ํŠผ์˜ ํƒ€์ดํ‹€์„ ์„ค์ •
setTitleColor(_:for:) ๋ฒ„ํŠผ์˜ ํƒ€์ดํ‹€ ์ƒ‰์ƒ์„ ์„ค์ •
titleLabel ๋ฒ„ํŠผ์˜ ํƒ€์ดํ‹€ ๋ ˆ์ด๋ธ”์— ๋Œ€ํ•œ ์†์„ฑ๋“ค์„ ๊ด€๋ฆฌ
(ex: ํฐํŠธ, ์ •๋ ฌ ๋“ฑ)
addTarget(_:action:for:) ๋ฒ„ํŠผ์˜ ์•ก์…˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ ,
ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ์ด๋ฒคํŠธ๋ฅผ ์„ค์ •
let button = UIButton()

button.setTitle("Click me", for: .normal)
button.setTitleColor(.white, for: .normal)
button.titleLabel?.font = UIFont.systemFont(ofSize: 16)
button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)

 

 

 

UIStackView ์ฃผ์š” ์†์„ฑ๋“ค

UIStackView ํด๋ž˜์Šค๋Š” ๋ทฐ๋ฅผ ๋ฐฐ์—ด๋กœ ๊ด€๋ฆฌํ•˜๊ณ , ํ•ด๋‹น ๋ทฐ๋“ค์„ ํ•œ ์ค„์ด๋‚˜ ํ•œ ์—ด๋กœ ์ •๋ ฌํ•œ๋‹ค.

arrangedSubviews ์ •๋ ฌ๋œ ์„œ๋ธŒ๋ทฐ๋“ค์˜ ๋ฐฐ์—ด์„ ์„ค์ •
axis ์Šคํƒ๋ทฐ์˜ ์ •๋ ฌ ๋ฐฉํ–ฅ (์ˆ˜์ง ๋˜๋Š” ์ˆ˜ํ‰)์„ ์„ค์ •
distribution ์Šคํƒ๋ทฐ์˜ ์„œ๋ธŒ๋ทฐ๋“ค์˜ ๋ฐฐ์น˜ ๋ฐฉ์‹์„ ์„ค์ •(๊ท ๋“ฑ ๋ฐฐ์น˜, ๊ท ๋“ฑ ๊ฐ„๊ฒฉ ๋“ฑ)
alignment ์Šคํƒ๋ทฐ ๋‚ด์˜ ์„œ๋ธŒ๋ทฐ๋“ค์˜ ์ •๋ ฌ ๋ฐฉ์‹์„ ์„ค์ •(์ƒํ•˜ ์ •๋ ฌ, ๊ฐ€์šด๋ฐ ์ •๋ ฌ ๋“ฑ)
spacing ์„œ๋ธŒ๋ทฐ๋“ค ๊ฐ„์˜ ๊ฐ„๊ฒฉ์„ ์„ค์ •
let stackView = UIStackView()

stackView.addArrangedSubview(label)
stackView.axis = .vertical
stackView.distribution = .fillEqually
stackView.alignment = .center
stackView.spacing = 10

 

 

 

 

UIStackView ์ฃผ์š” ๋ฉ”์„œ๋“œ

addSubview() UIView ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋กœ, UIStackView ํด๋ž˜์Šค๊ฐ€ ์ƒ์†๋ฐ›์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ์ฃผ์–ด์ง„ ๋ทฐ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ทฐ์˜ ํ•˜์œ„ ๋ทฐ ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

addSubview๋Š” UIStackView์—์„œ ์ง์ ‘์ ์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋Š” ์•„๋‹ˆ์ง€๋งŒ, UIView์˜ ํ•˜์œ„ ํด๋ž˜์Šค์ธ UIStackView์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, UIStackView์— ์ƒˆ๋กœ์šด ์„œ๋ธŒ๋ทฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด addArrangedSubview๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
addArrangedSubview(_:) ์ง€์ •๋œ ์ธ๋ฑ์Šค์— ๋ทฐ๋ฅผ ์ •๋ ฌ๋œ ์„œ๋ธŒ๋ทฐ ๋ฐฐ์—ด์— ์‚ฝ์ž….
์ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์œ„์น˜์— ๋ทฐ๋ฅผ ์ถ”๊ฐ€
insertArrangedSubview(_:at:) ์ง€์ •๋œ ์ธ๋ฑ์Šค์— ๋ทฐ๋ฅผ ์ •๋ ฌ๋œ ์„œ๋ธŒ๋ทฐ ๋ฐฐ์—ด์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์œ„์น˜์— ๋ทฐ๋ฅผ ์ถ”๊ฐ€
removeArrangedSubview(_:) ์ฃผ์–ด์ง„ ๋ทฐ๋ฅผ ์ •๋ ฌ๋œ ์„œ๋ธŒ๋ทฐ ๋ฐฐ์—ด์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ๋ทฐ๋ฅผ ์‚ญ์ œํ•  ๋•Œ ์‚ฌ์šฉ
setCustomSpacing(_:after:) ๋‘ ์„œ๋ธŒ๋ทฐ ์‚ฌ์ด์˜ ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ„๊ฒฉ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ๋ทฐ ๋‹ค์Œ์— ๊ฐ„๊ฒฉ์„ ์„ค์ •ํ•  ๋•Œ ์œ ์šฉ
import UIKit

// UIStackView ์ƒ์„ฑ
let stackView = UIStackView()
stackView.axis = .vertical
stackView.alignment = .center
stackView.spacing = 10

// Label ์ƒ์„ฑ ๋ฐ ์„ค์ •
let label1 = UILabel()
label1.text = "Label 1"
label1.backgroundColor = .blue
label1.textAlignment = .center

// UIStackView์— Label์„ addArrangedSubview๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”๊ฐ€
stackView.addArrangedSubview(label1)

// UIStackView๋ฅผ ํ™”๋ฉด์— ์ถ”๊ฐ€ํ•˜๋Š” ์ฝ”๋“œ (์˜ˆ์‹œ์—์„œ ์ƒ๋žต)


//=======================================================

// UIStackView ์ƒ์„ฑ
let stackView = UIStackView()
stackView.axis = .vertical
stackView.alignment = .center
stackView.spacing = 10

// Label ์ƒ์„ฑ ๋ฐ ์„ค์ •
let label2 = UILabel()
label2.text = "Label 2"
label2.backgroundColor = .green
label2.textAlignment = .center

// UIStackView์— ์ง์ ‘ ์„œ๋ธŒ๋ทฐ๋ฅผ ์ถ”๊ฐ€
stackView.addSubview(label2)

// SnapKit์„ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”๊ฐ€ํ•œ ๋ทฐ์˜ ์ œ์•ฝ ์กฐ๊ฑด ์„ค์ •
label2.snp.makeConstraints { make in
    make.top.equalToSuperview().offset(20)
    make.leading.equalToSuperview().offset(20)
    make.width.equalTo(200)
    make.height.equalTo(50)
}

// UIStackView๋ฅผ ํ™”๋ฉด์— ์ถ”๊ฐ€ํ•˜๋Š” ์ฝ”๋“œ (์˜ˆ์‹œ์—์„œ ์ƒ๋žต)

 

 

 


SnapKit ์ œ์•ฝ ์กฐ๊ฑด ์†์„ฑ๋“ค

SnapKit ์†์„ฑ๋“ค์€ Auto Layout ์ œ์•ฝ ์กฐ๊ฑด์„ ์„ค์ •ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. 

makeConstraints ์ œ์•ฝ ์กฐ๊ฑด์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋ฉ”์„œ๋“œ
equalTo ํ•ด๋‹น ๋ทฐ์˜ ํฌ๊ธฐ๋‚˜ ์œ„์น˜๋ฅผ ๋‹ค๋ฅธ ๋ทฐ์™€ ๊ฐ™๊ฒŒ ์„ค์ •
eqalToSuperview ๋ถ€๋ชจ ๋ทฐ์— ๋Œ€ํ•ด ๋™์ผ์„ฑ์„ ์„ค์ •
width, height ๋ทฐ์˜ ๋„ˆ๋น„๋‚˜ ๋†’์ด๋ฅผ ์„ค์ •
leading, trailing ๋ทฐ์˜ leading (์™ผ์ชฝ) ๋˜๋Š” trailing (์˜ค๋ฅธ์ชฝ) ์ œ์•ฝ ์กฐ๊ฑด์„ ์„ค์ •
top, bottom ๋ทฐ์˜ top ๋˜๋Š” bottom ์ œ์•ฝ ์กฐ๊ฑด์„ ์„ค์ •
centerX, centerY ๋ทฐ์˜ centerX (๊ฐ€๋กœ ์ค‘์•™) ๋˜๋Š” centerY (์„ธ๋กœ ์ค‘์•™) ์ œ์•ฝ ์กฐ๊ฑด์„ ์„ค์ •
// centerX, centerY ์˜ˆ์ œ
view.snp.makeConstraints { make in
    make.centerX.equalToSuperview()
    make.centerY.equalToSuperview()
}

// width, height ์˜ˆ์ œ
view.snp.makeConstraints { make in
    make.width.equalTo(100)
    make.height.equalTo(50)
}

// leading, top, trailing, bottom ์˜ˆ์ œ
view.snp.makeConstraints { make in
    make.leading.equalToSuperview().offset(20)
    make.top.equalToSuperview().inset(30)
    make.trailing.equalToSuperview().offset(-20)
    make.bottom.equalToSuperview().inset(30)
}

// edges ์˜ˆ์ œ
view.snp.makeConstraints { make in
    make.edges.equalToSuperview().inset(UIEdgeInsets(top: 10, left: 20, bottom: 10, right: 20))
}

 

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ