๐ฃ ํ๊ณ ์ ํ๋ ๊ฒ
์ง๊ธ ํด๋น ๋ทฐ์ ์๋ ์นดํ ๊ณ ๋ฆฌ ๋ฒํผ์ collectionView๋ก ๊ตฌํ์ค์ด๋ค. ์ผ๋จ ๋ด๋ถ cell์ ์์ ๊ฐ์ ๋ฃ์ด์ ์ด๋ ๊ฒ ๋ง๋ค์ด์คฌ๋ค.
๊ทธ๋ฅ ๊ธ์ ํฌ๊ธฐ์ ์๊ด ์์ด ์ผ์ ํ ๋ฒํผ ํฌ๊ธฐ๋ฅผ ๊ฐ๋๋ค. ํ์ง๋ง ๋ด๊ฐ ๊ตฌํํด์ผํ๋ ํ๋ฉด์ ์๋์ฒ๋ผ ๊ธ์ ํฌ๊ธฐ์ ๋ง์ถฐ์ ๋ฒํผ์ ํฌ๊ธฐ๋ ๋ฐ๋๋ ๊ฒ,, ์ด๋ ๊ฒ ํ๊ณ ์ถ๋ค.
๐ฃ Cell์ ํฌ๊ธฐ๋ฅผ ์์๊ฐ์ผ๋ก ๋ง๋ค๋ฉด ์๋ผ!
๐ก cell ๋ด๋ถ์ ๋ค์ด๊ฐ๋ label์ ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํด์ cell์ ํฌ๊ธฐ๋ก ์ง์ ํด์ฃผ์.
์๋ชจ์กฐ๋ชจ ํ๋ก์ ํธ๋ฅผ ์งํํ ๋ button์ ๋ง๋ค๋ ์ด๋ฐ ๋ฐฉ์์ ์ฌ์ฉํ์๋ค. ์ด ๋ถ๋ถ์ด ์๊ฐ๋์ ๋ฐ๋ก ์คํ์ ์ฎ๊ฒจ๋ดค๋ค.
label์ ํฌ๊ธฐ๋ฅผ ๊ตฌํ๋ ์ฝ๋
์๋ฌด๋๋ ๋ฒํผ ๋ฑ ๋ค์ํ ๋ฐฉ๋ฉด์์ ์ฌ์ด์ฆ๋ฅผ ๊ตฌํ๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ ๊ฒ ๊ฐ์์, size๋ฅผ ๊ตฌํ๋ ๋งค๋์ ๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ ๊ทธ ๋ด๋ถ์ ํจ์๋ก ๊ตฌํํด์ฃผ์๋ค.
enum Frame {
case widthAnchor, heightAnchor
}
struct CalculateSizeManager {
func calculateCategoryButton(_ anchor: Frame, with buttonTitle: String) -> CGFloat {
let label = UILabel()
label.text = buttonTitle
label.sizeToFit()
switch anchor {
case .widthAnchor:
return label.frame.width + 24
case .heightAnchor:
return label.frame.height + 10
}
}
}
cell ๋ด๋ถ์ text๋ฅผ ๋ณ๊ฒฝํด์ค๋ width๋ฅผ ๊ฐ์ด ๋ณ๊ฒฝ
cell ๋ด๋ถ์ ๋ค์ด๊ฐ๋ ์นดํ ๊ณ ๋ฆฌ ๊ธ์ ํฌ๊ธฐ๋ฅผ ์์์ผ ํฌ๊ธฐ ์ง์ ์ ํ ์ ์์ด์ setData๋ผ๋ ํจ์๋ก ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๋ฃ์ด์ฃผ๋ ํจ์ ๋ด๋ถ์ ๊ณ์ฐํ๊ณ , width๋ฅผ ๊ณ์ฐํด์ฃผ์๋ค.
func setData(with category: String) {
categoryLabel.text = category
categoryLabel.constraint(.widthAnchor,
constant: CalculateSizeManager().calculateCategoryButton(.widthAnchor, with: category))
categoryLabel.constraint(.heightAnchor,
constant: CalculateSizeManager().calculateCategoryButton(.heightAnchor, with:category))
}
๐จ ์๋ ๊ทผ๋ฐ width๋ง ์ง์ ํ์๋๋ ์ ๋์ค๋๋ฐ, height๊น์ง ์ ์ฉํ๋ฉด, ์ด๋ ๊ฒ ํ๋ฉด์ด ๊นจ์ ธ๋์ค๊ณ , ์ฝ์์ฐฝ์ด ๋จ๋จํ ํ๊ฐ๋๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ,,, ๋งจ ์์ 5๋งํผ์ cell ์ฌ์ด ๊ฐ๊ฒฉ์ด ์๊ธฐ๊ณ , height๊ฐ ๋ญ๊ฐ ์๋ ค๋์ค๋ ํ์์ด ๋ฐ์ํ๋ค. ๋ฌด์จ์ผ์ด๋์์์์๋๋์ฒด๊ฐ!
โ ์ ํด๊ฒฐํ ๊ฑฐ๊ฐ์ ๋๋์ฐ
์ฝ์์ฐฝ์ ๋ณด๋ ํ๋ด๊ณ ์๋ ๊ฒ์ค์ ํ๋๊ฐ ์ด๊ฑฐ์๋ค.
๐ซ the item height must be less than the height of the UICollectionView minus the section insets top and bottom values, minus the content insets top and bottom values.
์! ๋์ด๊ฐ ๋ฌธ์ ๊ตฌ๋!!
์๋๋ฉด!!! ๋ด๊ฐ UICollectionView์ height๋ฅผ 26์ผ๋ก ๊ณ ์ ํด๋จ๊ธฐ ๋๋ฌธ์ด์ง~~~ >,<๐ซ โญ๏ธ
private func setupLayout() {
view.addSubviews(descriptionLabel, categoryCollectionView)
NSLayoutConstraint.activate([
descriptionLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 8),
descriptionLabel.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 16),
categoryCollectionView.topAnchor.constraint(equalTo: descriptionLabel.bottomAnchor, constant: 16),
categoryCollectionView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16),
categoryCollectionView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16)
categoryCollectionView.heightAnchor.constraint(equalToConstant: 26)
])
}
์ง์, ์ด๋ ๊ฒ ๋ ์ด์์์ด ์กํ์์๋ค. ์ฌ๊ธฐ์ ๋ณด๋ฉด, ๋งจ ๋ง์ง๋ง์ height๋ฅผ 26๊ณ ์ ๊ฐ์ผ๋ก ์ค์ ํด๋์๋๋ฐ, ์ด๊ฒ ๋๋ฌธ์ธ๊ฒ ๊ฐ๋ค. ์์ ํด๋ณด์
์ฌ๊ธฐ์ ์ ๊น, ๊ทผ๋ฐ
cell์ ํฌ๊ธฐ์ ๋ฐ๋ผ์ collectionView์ height๋ฅผ ์ง์ ํ ์๋ ์๋๊ฑธ๊น? ์คํ ๋ ์ด์์์์ ๋จผ์ height๋ฅผ ์ง์ ํด์ผํ๋ค๊ณ ๋์ค๋๋ฐ… (์คํ ๋ ์ด์์์ผ๋ก height์ค์ ์ํด์ฃผ๋ฉด ๋ชจํธํ๋ค๊ณ ๋ณด๋ผ์์๋ฌ๋ธ)
์๋์ผ๋ก ๋ชปํ๋๊ฑด๊ฐใ ใ
์ผ๋จ ์ผ๋งค์ ๋ฐฉ๋ฒ์ผ๋ก,, calculate๋ ๊ฐ์ collectionView์ height์ ๋ฃ์ด์ฃผ์๋ค.
categoryCollectionView.heightAnchor.constraint(equalToConstant: CalculateSizeManager().calculateCategoryButton(.heightAnchor, with: "temp"))
๋ด๊ฐ ๊ตฌ์ฑํด๋์ CalculateCategoryButton ํจ์ ๋ด๋ถ์์๋ with์ ๋ค์ด์ค๋ ํ ์คํธ์ ํฌ๊ธฐ์ ๋ฐ๋ผ์ ๋์ด๋ฅผ ์ ํด์ฃผ์๋ค. ์ ๊ธฐ๋ค๊ฐ “temp” ๋ฃ์ด์ ์ฌ์ด์ฆ ์ฃผ๋๊ฑฐ ๋๋ฌด ์ด์ํ๋ฐ,, ์ถ์๋ค.
โ ์๋ ๊ทธ๋ผ text ๊ฐ์ ์ ๋ ฅ์ํด๋ ๋๋๋ก ๋งค๊ฐ๋ณ์๋ฅผ ์ต์ ๋๋ก ์์ ํด๋ณด์
์ง๊ธ ๋ด๊ฐ ๊ตฌํํด๋์ ์ฝ๋๋ฅด ๋ณด๋ฉด, manager์์๋ textStyle์ ๊ณ ๋ คํ์ง ์๋๋ค. ๋ง์ฝ ๋งค๊ฐ๋ณ์๋ก textStyle๊น์ง ์ ๋ ฅ๋ฐ์์, ๊ทธ ํฐํธ์ ํฌ๊ธฐ ๋์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ธธ์ด๋ฅผ ์ ํด์ฃผ๋ฉด?? ์ด๊ฑฐ๋ค!!
struct CalculateSizeManager {
func calculateCategoryButton(_ anchor: Frame, with buttonTitle: String?) -> CGFloat {
let label = UILabel()
label.text = buttonTitle ?? "temp"
label.sizeToFit()
switch anchor {
case .widthAnchor:
return label.frame.width + 24
case .heightAnchor:
return label.frame.height + 8
}
}
}
์ด๋ ๊ฒ ์ ๋ ฅ๋ฐ๋ buttonTitle์ ์ต์ ๋๊ฐ์ผ๋ก ์ฒ๋ฆฌํด์ค์, ์คํ ๋ ์ด์์์ ์ค์ ํด์ค๋ ๊ตณ์ด ‘text’๊ฐ์ด ์์ด๋ ๋๊ฒ๋ ๋ง๋ค์ด์ฃผ์๋ค.
๊ทธ๋ผ, collectionView์ ์คํ ๋ ์ด์์์ ์๋์ฒ๋ผ ๋ฐ๊ฟ ์ ์๋ค.
categoryCollectionView.topAnchor.constraint(equalTo: descriptionLabel.bottomAnchor, constant: 16),
categoryCollectionView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16),
categoryCollectionView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16),
categoryCollectionView.heightAnchor.constraint(equalToConstant: CalculateSizeManager().calculateCategoryButton(.heightAnchor, with: nil))