TableView
의 각 cell 의 높이를 다르게 설정하기 위해서는 어떻게 해야 할까요?
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 80
}
우리는 지금까지 위의 코드를 통해서 고정적인 cell 의 높이를 사용해 왔습니다.
그렇기 때문에 위와 같이, 특정한 셀에서 표현하고 싶은 내용이 짤려서 출력되는 경우가 발생하게 됩니다.
이때, 각 셀에서 표현되는 내용에 따라 자동으로 셀의 높이를 조절하기 위해서 사용하는 것이 Automatic Dimension
입니다.
우선, 사용법을 먼저 확인해보겠습니다.
override func viewDidLoad() {
super.viewDidLoad()
tableView.estimatedRowHeight = 100
tableView.rowHeight = UITableView.automaticDimension
}
viewDidLoad()
함수에 위와 같이 코드를 작성하고 앞서 우리가 cell 의 높이를 결정하기 위해 사용했던 heightForRowAt
함수를 주석처리 합니다.
heightForRowAt
함수와 위의 코드에서 설정한 rowHeight
, estimatedRowHeight
은 어떤 차이가 있는걸까요?
애플 공식 문서를 간단하게 요약해보면, estimatedRowHeight
를 통해서 임시높이를 명시합니다. (해당 설정을 통해 스크롤 성능을 향상 할 수 있다고합니다.)
그리고 rowHeight 을 설정해주는데, cell content 의 AutoLayout
을 잘 설정했다면, automaticDimension
을 통해서 각 셀의 높이를 자동으로 설정할 수 있습니다.
heightForRowAt
을 살펴보면,
The value returned by this method takes precedence over the value in the rowHeight property.
즉, 해당 메서드를 통해 설정된 값이 우선순위를 가지기 때문에 automatic Dimension
을 적용하기 위해서 주석처리 한것입니다.
❗️ 위, 아래 Layout 설정 똑바로 안하면 적용되지 않으니 주의주의주의!!!!!
블로그에서 한번 살펴봤던 내용입니다. 그때는 Storyboard 를 이용했는데, 이번에는 코드로 Navigation Contoller
를 구현해보려고 합니다.
❗️정확하게는 화면전환에 대해서 알아 보는게 맞는것 같습니다..
코드로 화면전환을 개발하게 되면 스토리보드를 통해 구현하는것 보다 세부적인 설정이 가능합니다. ex) Transition style
스토리보드에서 segue
를 통해서 화면들을 연결했던 것과 마찬가지로 크게 Modal
과 show
2 가지가 있습니다.
❓ Modal 방식은 왜 Navigation Controller 가 없어도 될까요?
Modal 방식을 통해서 화면전환을 하는 경우, 해당 view 상단에 Navigation Item 이 존재하지 않는 것을 확인 할 수 있습니다.
즉, 둘은 다른 화면전환 방식입니다.
Modal은 UIViewController 에 내장되어 있습니다!
코드를 통해서 확인 해보겠습니다.
@IBAction func searchButtonClicked(_ sender: UIBarButtonItem) {
//1) 어떤 스토리보드를 사용할 것인가?
let sb = UIStoryboard(name: "Main", bundle: nil)
//2) 선택한 스토리보드에서 어떤 viewController 로 화면전환 할 것인가?
// Storyboard Identifier
let vc = sb.instantiateViewController(withIdentifier: "SearchTableViewController") as! SearchTableViewController
// option) NavigationController Embed
let nav = UINavigationController(rootViewController: vc)
// option) Transition Style 설정
nav.modalPresentationStyle = .fullScreen
// 3) 화면 전환 방법 선택 (Present)
present(nav, animated: true, completion: nil)
}
만약 현재 뷰컨트롤러의 버튼을 통해서 다른 화면으로 전환 한다고 가정해 보겠습니다.
그럼 위의 코드 처럼 세 가지 설정이 필요합니다.
어떤 스토리 보드를 사용할 것인가?
해당 스토리보드의 어떤 화면으로 전환할 것인가?
어떤 방식으로 화면을 전환 할 것인가?
위와 같은 코드를 통해서, 우리가 원하는 화면으로 전환할 수 있습니다.
그럼, 이전화면으로 돌아오려면 어떻게 해야 할까요?
❗️ 화면을 새롭게 띄우면 띄운 화면을 사라지게끔 구현해야합니다!
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.leftBarButtonItem = UIBarButtonItem(image: UIImage(systemName: "xmark"), style: .plain, target: self, action: #selector(closeButtonClicked))
}
//present - dismiss 로 쌍을 이루어줘야 한다!
@objc
func closeButtonClicked() {
dismiss(animated: true, completion: nil)
}
새롭게 띄운 화면의 뷰컨트롤러에 위와 같이 코드를 작성합니다.
❓
modal(present) 방식에 full Screen 으로 화면 전환했습니다.
그렇기 때문에 네비게이션 엠베드를 하지 않으면, 네비게이션 아이템을 사용할 수 없습니다. (nav1 -> nav1rv -> nav2 -> nav2rc 형태)
백신맞고 진짜 사경을 헤매다왔습니다.. ㅠㅠ
오늘은 protocol
, enum -> caseIterable
, passData
를 중심으로 공부하고 정리하도록 하겠습니다!