이번 노트에서는 iOS의 AutoLayout을 쉽게 설정할 수 있도록 해주는 SnapKit 라이브러리에 대해서 기술해 보려 합니다.
SnapKit은 iOS, OS X등의 앱 개발에서 AutoLayout을 코드로 구현할 때 사용하는 강력한 라이브러리에요. 기존의 복잡한 NSLayoutConstraint 코드를 더 읽기 쉽고 유지보수가 용이한 레이아웃 코드를 작성할 수 있게 해줘요. 자, 사실 우리에게 중요한건 SnapKit이 무엇이냐보단 어떻게 쓰느냐일 태니.. 본론으로 들어가 볼게요.
SnapKit 라이브러리 문서에서는 세 가지 설치 방법을 제공해요.
pod init
명령어로 Podfile 생성 (Podfile이 없을 시)pod "SnapKit', '~> 5.7.0'
$ pod install
참고로 CocoaPods 1.1.0 이상 버전에서는 SnapKit 버전으 4.0.0이상 설치를 해야한다네요.
github "SnapKit/SnapKit" ~> 5.0.0
$ carthage update --use-xcframeworks --platform iOS
https://github.com/SnapKit/SnapKit
아래 이미지 처럼 부모 뷰인 containerView(UIView)
에 자식 뷰들 imageView(UIImageView)
와 label(UILabel)
, button(UIButton)
의 UI Layout을 설정한다고 가정해 볼게요.
SanpKit을 사용하지 않는 즉, 기존에 NSLayoutConstraints설정 방식대로 라면 다음과 같은 코드일 거에요.
func setLayout() {
containerView.addSubview(imageView)
containerView.addSubview(label)
containerView.addSubview(button)
containerView.translatesAutoresizingMaskIntoConstraints = false
imageView.translatesAutoresizingMaskIntoConstraints = false
label.translatesAutoresizingMaskIntoConstraints = false
button.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
imageView.widthAnchor.constraint(equalToConstant: 50.0),
imageView.heightAnchor.constraint(equalToConstant: 50.0),
imageView.topAnchor.constraint(equalTo: containerView.topAnchor, constant: 30.0),
imageView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor, constant: 20.0),
imageView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor, constant: -30.0),
label.leadingAnchor.constraint(equalTo: imageView.trailingAnchor, constant: 20.0),
label.centerYAnchor.constraint(equalTo: imageView.centerYAnchor),
button.widthAnchor.constraint(equalToConstant: 100.0),
button.heightAnchor.constraint(equalToConstant: 36.0),
button.trailingAnchor.constraint(equalTo: containerView.trailingAnchor, constant: -20.0),
button.centerYAnchor.constraint(equalTo: imageView.centerYAnchor)
])
}
길다..길어.. 요런 식으로.. 했던 코드를 SnapKit 라이브러리로 바꿔볼게요.
import SnapKit
func makeLayout() {
containerView.addSubview(imageView)
containerView.addSubview(label)
containerView.addSubview(button)
imageView.snp.makeConstraints { imageView in
imageView.size.equalTo(50.0)
imageView.top.equalToSuperview().inset(30.0)
imageView.leading.equalToSuperview().inset(20.0)
imageView.bottom.equalToSuperview().inset(30.0)
}
label.snp.makeConstraints {
$0.leading.equalTo(imageView.snp.trailing).offset(20.0)
$0.centerY.equalTo(imageView.snp.centerY)
}
button.snp.makeConstraints { button in
button.size.equalTo(CGSize(width: 100.0, height: 36.0))
button.trailing.equalToSuperview().inset(20.0)
button.centerY.equalTo(imageView.snp.centerY)
}
}
어떤가요?? 훨씬 간결하고 코드양도 확 줄어보이지 않나요? (저는.. 줄어보여요..ㅎ)
그럼 SnapKit에서 주로 사용되는 주요 메서드 몇가지만 알아볼게요.
translatesAutoresizingMaskIntoConstraints
을 false
로 설정 해야 원하는 제약조건을 설정할 수 있었어요.$0
으로도 접근이 가능해요.view.snp.makeConstraints {
$0.top.equalToSuperview()
}
view.snp.makeConstraints { view in
view.top.equalToSuperview()
}
updateConstraints
작성 방식은 makeConstraints
과 동일해요.
다만 이 메서드는 이미 설정된 제약 조건만 업데이트하며 설정되지 않은 제약조건 접근 시 에러를 일으킨다는 점을 주의해야 해요.
remakeConstraints
기존의 모든 제약 조건을 제거하고 새로운 제약 조건을 설정해요.
우리가 보기에 동작은 makeConstraints와 비슷하게 보일 수 있어요.
removeConstraints
해당 뷰에 설정된 모든 제약조건을 제거해요.
view.snp.makeConstraints {
$0.top.equalTo(imageView.snp.top) // 다른 뷰와의 제약 조건 설정
$0.height.equalTo(50.0) // 상수 값과 동일한 제약 조건 설정
}
view.snp.makeConstraints {
// top, bottom의 constraint를 부모뷰와 동일하도록 제약 조건 설정
$0.verticalEdges.equalToSuperview()
}
view.snp.makeConstraints {
// 상위 뷰와 하위 뷰 left, right의 간격을 20만큼의 제약 조건 설정
$0.horizontalEdges.equalToSuperview().inset(20.0)
}
view.snp.makeConstraints {
// 동일한 depth의 view의 trailing에 imageView의 leading간의 간격을 10만큼의 제약 조건 설정
$0.trailing.equalTo(imageView.snp.leading).offset(-10.0)
}
view.snp.makeConstraints {
// 상수로 우선순위 설정
$0.top.equalTo(imageView.snp.top).priority(999)
// enum으로 우선순위 설정
$0.top.equalTo(imageView.snp.top).priority(.high)
}
SnapKit은 iOS앱 개발자들이 AutoLayout 코드로 개발을 진행할 때 간결한 코드를 제공해 생산성을 크게 향상시켜준다고 생각해요.
그럼 이번 노트는 여기서 끗!!
2025년도 화이팅~!!! 🎉 🐍 🧧
https://github.com/SnapKit/SnapKit
https://snapkit.github.io/SnapKit/docs/