๐ ๋ค๋ฒ์งธ ํ๋ก์ ํธ
์ฑํ ๋ฆฌ์คํธ ์ฑ์ ๋ง๋ค์ด๋ณด์
1๏ธโฃ Data ํ์ธ ๋ฐ ChatListViewController ๋ง๋ค๊ธฐ
2๏ธโฃ Auto Layout
3๏ธโฃ UICollectionViewCell ๋ง๋ค๊ธฐ
// ChatListCollectionViewCell.swift
import UIKit
class ChatListCollectionViewCell: UICollectionViewCell {
@IBOutlet weak var thumbnail: UIImageView!
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var chatLabel: UILabel!
@IBOutlet weak var dateLabel: UILabel!
// Chat.swift ํ์ผ์ ์๋ ๋ด์ฉ์ ๋ฐ์์ ๋ด์ฉ ์
๋ฐ์ดํธ
func configure(_ chat: Chat){
thumbnail.image = UIImage(named: chat.name)
nameLabel.text = chat.name
chatLabel.text = chat.chat
dateLabel.text = chat.date
}
}
4๏ธโฃ Data๊ฐ ๋ค์ด๊ฐ๊ธฐ ์ ๊น์ง ViewController์ ์์ฑ๋์ด์ผ ํ ์ฝ๋ (์ค์ํ ํ๋กํ ์ฝ..)
//
// ChatListViewController.swift
// Chat List
//
// Created by ์ค์์ง on 2022/05/22.
//
import UIKit
class ChatListViewController: UIViewController {
@IBOutlet weak var collectionView: UICollectionView!
let chatList: [Chat] = Chat.list
override func viewDidLoad() {
super.viewDidLoad()
// Data, Presentation, Layout
// dataSource : data์ presentation์ ํํํด์ฃผ๋ ๊ฒ์ ๋๊ตฐ๊ฐ์๊ฒ ์์ํด์ฃผ๋ ์ญํ
collectionView.dataSource = self // self : ๋ฐ๋ก viewController ๋์ผ ๋
// delegate : Layout๋ ๋๊ตฐ๊ฐ์๊ฒ ์์
collectionView.delegate = self // ์ด๊ฒ๋ viewController
// self = ์์๋นํ๋ ๊ฐ์ฒด๋ก ๋ฐ๋ก viewController ์์ ์
}
}
// dataSource์ delegate ํ๋กํ ์ฝ์ ์ค์ํ๊ธฐ ์ํ extension (๊ฐ ํ๋กํ ์ฝ์ ํ์ํ ๋ฉ์๋๋ค์ ์์ฑ)
extension ChatListViewController: UICollectionViewDataSource {
// CollectionView์ ํํ๋๋ ์์ดํ
์ ๊ฐ์๊ฐ ๋ช๊ฐ์ธ์ง = chat list์ ๊ฐ์๋งํผ!
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return chatList.count
}
// cell์ ์ด๋ป๊ฒ ํํํ ์ง
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
// ์ฌ์ฌ์ฉ ๊ตฌ๋ถ์๋ฅผ ์ด์ฉํ์ฌ cell์ ๊ฐ์ ธ์ค๊ธฐ
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ChatListCollectionViewCell", for: indexPath)
return cell
}
}
// for Layout
// ChatListViewController๊ฐ FlowLayout์ ๋ํ ์ญํ ์ ์์๋ฐ์ ๊ฒ์ด๋ค.
extension ChatListViewController: UICollectionViewDelegateFlowLayout{
// Cell์ ์ฌ์ด์ฆ
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: collectionView.bounds.width, height: 100)
}
}
5๏ธโฃ Data ์ ๋ฐ์ดํธ : ์บ์คํ !
// ChatListViewController.swift
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
// ์ฌ์ฌ์ฉ ๊ตฌ๋ถ์๋ฅผ ์ด์ฉํ์ฌ cell์ ๊ฐ์ ธ์ค๊ธฐ
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ChatListCollectionViewCell", for: indexPath) as? ChatListCollectionViewCell else {
return UICollectionViewCell() // ์บ์คํ
์ด ์คํจํ ๊ฒฝ์ฐ ์คํ
}
// ์บ์คํ
์ ์ฑ๊ณตํ ๊ฒฝ์ฐ ์คํ๋๋ ์๋์ ์ฝ๋
let chat = chatList[indexPath.item]
cell.configure(chat)
return cell
}
6๏ธโฃ ๋ณด์
1. ์ฑํ ๋ด์ฉ ๋์ค๋ก ํํ
โ๏ธ๊ฐ์์์๋ ์ด๋ ๊ฒํ๋ฉด ๋๋ค๊ณ ํ๋๋ฐ ๋๋ ์๋๊ธธ๋.. ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ์๋ด
๋ฐ๋ก numberOfLines๋ฅผ ํตํด Label์ ์ค๋ฐ๊ฟ ์์ฑ ๊ฐ์ ์ฃผ์ด์ฃผ๋ ๊ฒ์ด๋ค.
// ChatListCollectionViewCell.swift
import UIKit
class ChatListCollectionViewCell: UICollectionViewCell {
@IBOutlet weak var thumbnail: UIImageView!
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var chatLabel: UILabel!
@IBOutlet weak var dateLabel: UILabel!
// Chat.swift ํ์ผ์ ์๋ ๋ด์ฉ์ ๋ฐ์์ ๋ด์ฉ ์
๋ฐ์ดํธ
func configure(_ chat: Chat){
thumbnail.image = UIImage(named: chat.name)
nameLabel.text = chat.name
chatLabel.text = chat.chat
dateLabel.text = chat.date
// ๋ฐ๋ก ์ด๋ ๊ฒก~!
chatLabel.numberOfLines = 2
}
}
2. ์ฑํ ๋ด์ฉ์ด๋ ๋ ์ง ์ฌ์ด์ ํ์ ๊ท ํ ๋น๋ฑํ์ฌ ๋ ์ง๊ฐ ๋ณด์ด์ง ์๋ ๋ฌธ์ ํด๊ฒฐ
Content Hugging Priority : ์ฐ์ ์์๊ฐ ๋์ผ๋ฉด ๋ด ํฌ๊ธฐ ์ ์ง. ์ฐ์ ์์ ๋ฎ์ผ๋ฉด ํฌ๊ธฐ ๋์ด๋จ
Content Compression Resistence Priority : ์ฐ์ ์์๊ฐ ๋์ผ๋ฉด ๋ด ํฌ๊ธฐ ์ ์ง. ์ฐ์ ์์ ๋ฎ์ผ๋ฉด ํฌ๊ธฐ ์์์ง
chatLabel๋ณด๋ค dateLabel์ด ๋ ํ์ด ์๋๋ก ํด๋ณด์
chatLabel์ด dateLabel๋ณด๋ค ์ฝํด์ผํ๊ธฐ ๋๋ฌธ์,
-> ์ด๋ ๊ฒ ํ๋ฉด ํ์ ๊ท ํ์ ์์ด์ chatLabel์ dateLabel๋ณด๋ค ์ฝํ์ฌ ์ชผ๊ทธ๋ผ๋ ๋ค.
3. ๋ ์ง ํํ ์ค์ด๊ธฐ
- DateFormatter() ๊ฐ์ฒด ์ด์ฉ
//
// ChatListCollectionViewCell.swift
// Chat List
//
// Created by ์ค์์ง on 2022/05/22.
//
import UIKit
class ChatListCollectionViewCell: UICollectionViewCell {
@IBOutlet weak var thumbnail: UIImageView!
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var chatLabel: UILabel!
@IBOutlet weak var dateLabel: UILabel!
// Chat.swift ํ์ผ์ ์๋ ๋ด์ฉ์ ๋ฐ์์ ๋ด์ฉ ์
๋ฐ์ดํธ
func configure(_ chat: Chat){
thumbnail.image = UIImage(named: chat.name)
nameLabel.text = chat.name
chatLabel.text = chat.chat
dateLabel.text = formattedDateString(dateString: chat.date)
chatLabel.numberOfLines = 2
}
func formattedDateString(dateString: String) -> String {
// String -> Date -> String ์์ผ๋ก ๋ณํ์์ผ์ค์ผํจ.
// 2022-04-01 > 4/1
// DateFormatter() ๊ฐ์ฒด ์ด์ฉ
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
// String -> Date ๋ณํ
if let date = formatter.date(from: dateString){
formatter.dateFormat = "M/d"
// Date -> String ๋ณํ
return formatter.string(from: date)
} else {
return ""
}
}
}
4. ๋ ์ง๋ฅผ ์ญ์์ผ๋ก ๋ฐ๊พธ๊ธฐ (์ต์ ๋ํ๊ฐ ๊ฐ์ฅ ์๋ก!)
- ๋ฐฐ์ด ๋ด์ฅํจ์์ธ sort๋ฅผ ์ด์ฉ
// ChatListViewController.swift
// ...
override func viewDidLoad() {
//...
// closure ํํ๋ฐฉ๋ฒ์ ํตํด์ sort ํจ์ ์ด์ฉ
chatList = chatList.sorted(by: {chat1, chat2 in return chat1.date > chat2.date})
// -> date์ ๋ฐ๋ผ ์ญ์์ผ๋ก ์ ๋ ฌ๋ chatList๊ฐ ์ถ๋ ฅ๋๋ค.
}
5. ์ธ๋ค์ผ ํ ๋๋ฆฌ ์ฝ๊ฐ ๋ฅ๊ธ๊ฒ ๋ง๋ค๊ธฐ
- Storyboard์์ ๊บผ๋ด์์ ์ฝ๋๋ก ๋ฐ๊ฟ๋ณด์!
awakeFromNib() ํจ์ ์ฌ์ฉ -> storyboard์์ ๊บผ๋ด์ฌ ๋, ๋ถ๋ฆฌ์ด์ง๋ ํจ์
// ChatListCollectionViewCell.swift
import UIKit
class ChatListCollectionViewCell: UICollectionViewCell {
@IBOutlet weak var thumbnail: UIImageView!
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var chatLabel: UILabel!
@IBOutlet weak var dateLabel: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
thumbnail.layer.cornerRadius = 10
}
// ....
}
๐ ๊ตฌํ ์๋ฃ!
๐ ์ ๋ฆฌ,
- dataSource : data์ presentation์ ํํํด์ฃผ๋ ๊ฒ์ ๋๊ตฐ๊ฐ์๊ฒ ์์ํด์ฃผ๋ ํ๋กํ ์ฝ
- delegate : layout์ ๋๊ตฐ๊ฐ์๊ฒ ์์ํด์ฃผ๋ ํ๋กํ ์ฝ
- ์์ ๋๊ฐ์ ํ๋กํ ์ฝ์ ์ค์ํ extenstion ์ฝ๋๋ ์์ฑํด๋ดค์
- Content Hugging Priority์ Content Compression Resistence Priority์ ํตํ component๊ฐ์ ํ์ ์ธ๊ธฐ ๋ณ๊ฒฝ
- DateFormatter() ๊ฐ์ฒด๋ฅผ ์ด์ฉํ ๋ ์ง ํ์ ๋ณ๊ฒฝ
- ํด๋ก์ ํํ์ ํตํ sort() ํจ์ ์ฌ์ฉ -> ๋ฐฐ์ด์ ํน์ ์์๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ์ ๋ ฌ
Reference
ํจ์คํธ์บ ํผ์ค ์จ๋ผ์ธ ๊ฐ์
'iOS > Toy project' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS : Toy Project] Apple Framework List (2) (0) | 2022.05.28 |
---|---|
[iOS : Toy Project] Apple Framework List (1) (0) | 2022.05.28 |
[iOS : Toy Project] Stock Rank (0) | 2022.05.21 |
[iOS : Toy Project] Simple Weather (0) | 2022.05.17 |
[iOS : Toy Project] Symbol Roller (0) | 2022.05.12 |