UIKit을 사용하여 책 검색 앱을 구현한 과정을 정리하였다. TabBarController를 기반으로 검색 화면과 북마크 화면을 구현하고, SnapKit을 활용하여 UI를 구성하였다.
├── ViewController (TabBarController)
├── BookSearchViewController
│ ├── SearchBar
│ ├── Color Filters
│ └── BookListTableView
├── BookDetailViewController
├── BookmarkViewController
└── BookSearchCell
class ViewController: UITabBarController {
private func setupTabBar() {
// 첫 번째 탭 - 검색 화면
let searchVC = BookSearchViewController()
let searchNav = UINavigationController(rootViewController: searchVC)
searchNav.tabBarItem = UITabBarItem(
title: "검색",
image: UIImage(systemName: "magnifyingglass"),
selectedImage: UIImage(systemName: "magnifyingglass.fill")
)
// 두 번째 탭 - 북마크 화면
let bookmarkVC = BookmarkViewController()
let bookmarkNav = UINavigationController(rootViewController: bookmarkVC)
bookmarkNav.tabBarItem = UITabBarItem(
title: "저장된 책",
image: UIImage(systemName: "bookmark"),
selectedImage: UIImage(systemName: "bookmark.fill")
)
self.viewControllers = [searchNav, bookmarkNav]
self.tabBar.tintColor = .systemBlue
self.tabBar.backgroundColor = .white
}
}
class BookSearchViewController: UIViewController {
// UI 컴포넌트 설정
private let searchBar: UISearchBar = {
let searchBar = UISearchBar()
searchBar.placeholder = "검색할 책 제목을 입력해주세요"
return searchBar
}()
// 컬러 필터 설정
private func setupComponents() {
[redFilterView, orangeFilterView, yellowFilterView, greenFilterView].forEach {
$0.layer.cornerRadius = 15
filterContainerView.addSubview($0)
}
}
// SnapKit을 활용한 레이아웃 설정
private func setupConstraints() {
searchBar.snp.makeConstraints { make in
make.top.equalTo(view.safeAreaLayoutGuide).offset(10)
make.leading.trailing.equalToSuperview().inset(20)
make.height.equalTo(44)
}
// ... 기타 제약조건
}
}
class BookSearchCell: UITableViewCell {
private let titleLabel: UILabel = {
let label = UILabel()
label.font = .systemFont(ofSize: 16)
return label
}()
private let priceLabel: UILabel = {
let label = UILabel()
label.font = .systemFont(ofSize: 14)
label.textColor = .gray
return label
}()
func configure(title: String, price: String) {
titleLabel.text = title
priceLabel.text = price
}
}
서치바 외곽 선 제거
최근 본 책 원형 크기 조정
상단 여백 최적화
텍스트 크기 조정