SSAC iOS 앱 개발자 데뷔과정 - 12

Sangwon Shin·2021년 10월 17일
0

SSAC

목록 보기
10/19

📐 TableView Automatic Dimension

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 설정 똑바로 안하면 적용되지 않으니 주의주의주의!!!!!


🚥 Navigation Controller

블로그에서 한번 살펴봤던 내용입니다. 그때는 Storyboard 를 이용했는데, 이번에는 코드로 Navigation Contoller 를 구현해보려고 합니다.
❗️정확하게는 화면전환에 대해서 알아 보는게 맞는것 같습니다..

코드로 화면전환을 개발하게 되면 스토리보드를 통해 구현하는것 보다 세부적인 설정이 가능합니다. ex) Transition style

스토리보드에서 segue 를 통해서 화면들을 연결했던 것과 마찬가지로 크게 Modalshow 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 형태)


🏷 P.S.

백신맞고 진짜 사경을 헤매다왔습니다.. ㅠㅠ
오늘은 protocol, enum -> caseIterable, passData 를 중심으로 공부하고 정리하도록 하겠습니다!

profile
개발자가 되고싶어요

0개의 댓글