티스토리 뷰
안녕하세요.
오늘은 조금 가벼운(?) 이야기를 정리해볼까합니다.
(요즘 문서 정리만 하다보니 개발이 그리워지네요)
오늘 만들 거는 바로 아래 처럼 생긴 UI 입니다.
참고로 여러가지 방법이 있습니다만
만약 Cocapod 을 사용하시는 분들은 아래 링크를 통해 쉽게 만드시는 방법도 있습니다.
https://github.com/ElaWorkshop/TagListView
GitHub - ElaWorkshop/TagListView: Simple and highly customizable iOS tag list view, in Swift.
Simple and highly customizable iOS tag list view, in Swift. - GitHub - ElaWorkshop/TagListView: Simple and highly customizable iOS tag list view, in Swift.
github.com
위 방법도 물론 편하긴 하지만
하지만 저는 스토리보드에다가 만들어서 사용해 보겠습니다.
(Cocoapod 이 다 좋은데 가끔 Xcode 와 싸움(?)나더라고요)
일단 우리들의 영원한 동반자인 스토리보드에서 기본 틀 부터 만듭시다
저 하단의 버튼의 용도(?)는 나중에 알려드릴께요.
그리고 셀 안에 저희가 원하는 모양이 나오도록 라벨을 추가해 줍시다.
(저는 여기서 기본 Constraints 로 5 정도의 여유를 두고 만들었습니다.)
저는 이 셀 이름을 TagCollectCell 이라고 하겠습니다.
클래스를 만들어 주어야 사용이 가능하겠죠? (셀 안에 만들었던 라벨이랑 연결 해주셔야합니다!)
TagCollectCell
import Foundation
import UIKit
class TagCollectCell: UICollectionViewCell {
// Component
@IBOutlet weak var tagLbl: UILabel! // 라벨이랑 연결해 주세요
// ColotSet
let onColor = UIColor(red: 0.36, green: 0.25, blue: 0.61, alpha: 1.0)
let offColor = UIColor(red: 0.90, green: 0.94, blue: 1.0, alpha: 1.0)
//Func
func setCell(text: String, isOn: Bool){
self.layer.cornerRadius = 5
self.tagLbl.text = text
self.tagLbl.textColor = isOn ? UIColor.white : UIColor.black
self.backgroundColor = isOn ? onColor : offColor
}
}
이렇게 만들어 두고 ViewController 로 넘어갑시다.
기본적인 UICollectionView 작업을 먼저 해주도록 합시다
(저는 선택하면 색상을 바뀌게 하고 싶어서 [Bool]을 넣었습니다만 불필요시 빼주시면 됩니다.)
ViewController
import UIKit
class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {
// Tag 를 보여줄 뷰
@IBOutlet weak var tagCollectionTotalView: UICollectionView!
// 먹고싶다(?)
let tagList = ["쿠앤크","메로나","아몬드 빼빼로","콘칩","나쵸","꼬깔콘","빙그레 바나나","액셀런트","더위사냥","꿀꽈배기","버터와플","새우칩","스프링클","하리보","새콤달콤","푸딩","에이스","홈런볼","바밤바","허쉬","ABC 초콜릿"]
var tagOnOffArray : [Bool] = []
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.setBasicTag()
}
// Delegate 선언 및 선택 배열 자동 생성
func setBasicTag(){
self.tagCollectionTotalView.delegate = self
self.tagCollectionTotalView.dataSource = self
self.createBtnArray() // 선택한 셀을 확인하기 위해 제작
}
// Tag 갯수 만큼 제작
func createBtnArray(){
for _ in 0..<self.tagList.count{
self.tagOnOffArray.append(false)
}
}
// MARK: 콜렉션 뷰 데이터
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return self.tagList.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "TagCollectCell", for: indexPath) as! TagCollectCell
cell.setCell(text: self.tagList[indexPath.item], isOn: self.tagOnOffArray[indexPath.item])
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
self.tagOnOffArray[indexPath.item] = !self.tagOnOffArray[indexPath.item]
collectionView.reloadItems(at: [indexPath]) // 해당 셀만 변경
}
//MARK: 결과값 출력
@IBAction func clickSubmit(_ sender: Any) {
let alert = UIAlertController(title: "먹고싶어요!", message: self.getClickList(), preferredStyle: .alert)
alert.addAction(UIAlertAction.init(title: "확인", style: .cancel))
self.present(alert, animated: true)
}
func getClickList()->String{
var result : String = ""
for i in 0..<self.tagList.count{
if(self.tagOnOffArray[i]){
result += (" " + self.tagList[i])
}
}
return result
}
}
사실 여기까지만 해도 아래처럼 보이게 됩니다.
근데 이게 지금 리스트가 짧은게 여러개라 티가 잘안나지만
리스트에 따라서는 조금 이상하게 보일 수 도 있습니다.
예를 들면 아래처럼요
기본적으로 UICollectionView는 중앙 정렬이 기본이라 이렇게 보이게 됩니다.
하지만 저렇게 되어있으면 묘하게 신경쓰이게 되니
왼쪽 정렬로 바꿔주도록 합시다.
방법은 아래 링크를 참고해서 제작했습니다.
https://stackoverflow.com/questions/22539979/left-align-cells-in-uicollectionview
Left Align Cells in UICollectionView
I am using a UICollectionView in my project, where there are multiple cells of differing widths on a line. According to: https://developer.apple.com/library/content/documentation/WindowsViews/Conce...
stackoverflow.com
LeftAlignedCollectionViewFlowLayout
import Foundation
import UIKit
// from : https://stackoverflow.com/questions/22539979/left-align-cells-in-uicollectionview
class LeftAlignedCollectionViewFlowLayout: UICollectionViewFlowLayout {
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
let attributes = super.layoutAttributesForElements(in: rect)
var leftMargin = sectionInset.left
var maxY: CGFloat = -1.0
attributes?.forEach { layoutAttribute in
if layoutAttribute.frame.origin.y >= maxY {
leftMargin = sectionInset.left
}
layoutAttribute.frame.origin.x = leftMargin
leftMargin += layoutAttribute.frame.width + minimumInteritemSpacing
maxY = max(layoutAttribute.frame.maxY , maxY)
}
// 아래 줄을 추가안하시면 네모네모(?)하고 이상한 Cell을 목격할수있습니다.
self.estimatedItemSize = UICollectionViewFlowLayout.automaticSize // 해당 줄만 추가했습니다.
return attributes
}
}
위 클래스를 추가해주신 후 아래처럼 사용중인 UICollectionView에 추가해주시면 됩니다.
func setBasicTag(){
self.tagCollectionTotalView.delegate = self
self.tagCollectionTotalView.dataSource = self
// 아래 한줄 추가
self.tagCollectionTotalView.collectionViewLayout = LeftAlignedCollectionViewFlowLayout()
self.createBtnArray()
}
그러면 아래처럼 왼쪽으로 정렬된 Cell들을 확인할 수 있습니다.
오늘은 비교적 가벼운 내용으로 정리해봤는데
처음 하신 분들에게 도움이 되었으면 좋겠네요
그럼 오늘도 파이팅입니다.
'iOS개발 > Swift 기본' 카테고리의 다른 글
swift 여백 클릭해서 창닫기 (0) | 2023.07.03 |
---|---|
swift 현재 열린 UIViewController 전부 닫기 (0) | 2023.06.26 |
Swift 디스플레이 확대 / 축소 설정 감지 (0) | 2023.05.18 |
Swift UIPickerView 기본 다루기 (0) | 2023.05.08 |
Swift 스와이프 기능 넣기 (UISwipeGestureRecognizer) (0) | 2023.04.21 |