이번 포스팅에서는 프로젝트 모집/참여 플랫폼의 핵심 기능인 게시글 작성과 상세보기 화면을 구현하는 방법을 정리했다. UIKit과 SnapKit을 사용하여 구현했고, 추후 Firebase 연동을 위한 테스트 용도로 제작했다.
// 선택된 데이터를 저장하기 위한 속성들
private var selectedPositionType: String? // 구인/구직
private var selectedJob: String? // 직무
private var selectedTechStacks: [String] = [] // 기술 스택 (다중 선택 가능)
private var selectedUrgency: String? // 시급성
private var selectedIdeaStatus: String? // 아이디어 상황
private var selectedRecruits: String? // 모집 인원
private var selectedSituation: String? // 상황
private var selectedExperience: String? // 경험
private let scrollView: UIScrollView = {
let scrollView = UIScrollView()
scrollView.backgroundColor = UIColor(red: 1.0, green: 0.97, blue: 0.93, alpha: 1.0)
scrollView.showsVerticalScrollIndicator = true
return scrollView
}()
private func setupScrollView() {
view.addSubview(scrollView)
scrollView.addSubview(contentView)
scrollView.snp.makeConstraints { make in
make.top.equalTo(view.safeAreaLayoutGuide)
make.left.right.equalToSuperview()
make.bottom.equalTo(view.safeAreaLayoutGuide).offset(-70)
}
contentView.snp.makeConstraints { make in
make.edges.equalTo(scrollView.contentLayoutGuide)
make.width.equalTo(scrollView.frameLayoutGuide)
}
}
private func createTagButton(title: String, section: String) -> UIButton {
let button = UIButton()
button.setTitle(title, for: .normal)
button.titleLabel?.font = .systemFont(ofSize: 14)
button.setTitleColor(UIColor(red: 0.98, green: 0.57, blue: 0.24, alpha: 1.0), for: .normal)
button.backgroundColor = .white
button.layer.cornerRadius = 15
button.layer.borderWidth = 1
button.layer.borderColor = UIColor(red: 0.98, green: 0.57, blue: 0.24, alpha: 1.0).cgColor
button.contentEdgeInsets = UIEdgeInsets(top: 8, left: 16, bottom: 8, right: 16)
button.accessibilityIdentifier = section
button.addTarget(self, action: #selector(tagButtonTapped), for: .touchUpInside)
return button
}
private func createTagStackView(tags: [String], section: String) -> UIStackView {
let stackView = UIStackView()
stackView.axis = .horizontal
stackView.spacing = 8
stackView.alignment = .fill
stackView.distribution = .fillProportionally
tags.forEach { tag in
let button = createTagButton(title: tag, section: section)
stackView.addArrangedSubview(button)
}
return stackView
}
@objc private func tagButtonTapped(_ sender: UIButton) {
sender.isSelected = !sender.isSelected
if let section = sender.accessibilityIdentifier,
let title = sender.title(for: .normal) {
switch section {
case "구인/구직 선택":
selectedPositionType = sender.isSelected ? title : nil
deselectOtherButtons(in: sender.superview as! UIStackView, except: sender)
case "직무":
selectedJob = sender.isSelected ? title : nil
deselectOtherButtons(in: sender.superview as! UIStackView, except: sender)
case "기술 스택":
if sender.isSelected {
selectedTechStacks.append(title)
} else {
selectedTechStacks.removeAll { $0 == title }
}
}
updateButtonAppearance(sender)
}
}
private func createTagView(text: String) -> UIView {
let containerView = UIView()
containerView.backgroundColor = .white
containerView.layer.cornerRadius = 15
containerView.layer.borderWidth = 1
containerView.layer.borderColor = UIColor(red: 0.98, green: 0.57, blue: 0.24, alpha: 1.0).cgColor
let label = UILabel()
label.text = text
label.textColor = UIColor(red: 0.98, green: 0.57, blue: 0.24, alpha: 1.0)
label.font = .systemFont(ofSize: 14)
containerView.addSubview(label)
label.snp.makeConstraints { make in
make.center.equalToSuperview()
make.left.right.equalToSuperview().inset(16)
make.top.bottom.equalToSuperview().inset(8)
}
return containerView
}
이번 포스팅에서는 Firebase 연동을 위한 UI 구현 방법을 자세히 살펴봤다. 특히 재사용 가능한 컴포넌트 설계와 효율적인 상태 관리에 중점을 뒀다.
다음 포스팅에서는 이렇게 구현한 UI에 Firebase를 연동하여 실제 데이터를 저장하고 불러오는 방법을 다룰 예정이다.