UIPickerView의 attributedTitleForRow와 viewForRow의 구분

소개



UITableViewCell과 같이 「이미지와 텍스트」를 나란히 하고 싶은 경우, attributedTitleForRow 를 사용하는 방법과 viewForRow 를 사용하는 방법의 어느 쪽을 채용해야 하는가.



결론



가로 줄의 경우, attributedTitleForRow로 끝내는 쪽이 구현의 간결함이 됩니다.

반대로 이미지가 텍스트 위나 아래에 배치되는 등 레이아웃이 복잡해지면 viewForRow를 사용해야 합니다.

여담: delegate 메서드가 호출되는 순서



그런데 UIPickerView delegate의 메소드가 호출되는 순서는 어땠습니까?

1. widthForComponent



우선, 행의 높이보다 먼저 폭을 지정하는 메소드가 불립니다.
func pickerView(_ pickerView: UIPickerView,
                           widthForComponent component: Int) -> CGFloat

2. rowHeightForComponent



둘째, 높이입니다. 여기에서는 확정된 width를 이용할 수 있습니다.
func pickerView(_ pickerView: UIPickerView,
                           rowHeightForComponent component: Int) -> CGFloat

3. titleForRow 등



실제로 행에 표시하는 내용을 지정하는 메소드를 호출합니다.
3종류 있습니다만, 만일 3개가 구현되고 있는 경우는, viewForRow > attributedTitleForRow > titleForRow 의 차례로 우선됩니다.
특히 어느 메소드를 사용할까를 지정할 필요는 없습니다. 코드를 작성하는 것만으로 우선순위가 높은 메소드를 호출합니다.
func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView 
func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString?
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?

viewForRow 를 구현했을 경우는, attributedTitleForRow 이하는 무시됩니다.
attributedTitleForRow 와 titleForRow 를 구현하고 있는 경우, attributedTitleForRow 의 return 가 nil 의 경우는,titleForRow 가 불립니다.

관련



UIPickerViewDelegate Reference
구현 예 StringPickerPopover.swift

좋은 웹페이지 즐겨찾기