2017-10-02 12 views
0

autolayout을 사용하여 원하는 동작을 얻고 싶습니다 (대리자 등을 사용하여 가능하지 않은 경우). 내가 가진 것은 하나의 정적 셀이있는 tableView이며,이 셀에는 동적 프로토 타입 셀이있는 tableViewController가있는 containerView가 있습니다.containerView가 포함 된 정적 셀의 동적 높이

내가 원하는 것은 컨테이너보기가 임베드 된 정적 셀의 높이를 동적으로 설정하기 위해 autolayout을 사용할 수 있어야한다는 것입니다.

은 스토리 보드입니다 :

enter image description here

containerView이있는의 ViewController에서 :

enter image description here

이 내 제약 (컨테이너보기의있는 contentView 정적 셀)이다 고정 셀 내에서 무엇을 가지고 있습니까? ViewDidLoad 메서드 :

override func viewDidLoad() { 
    super.viewDidLoad() 

    courseDetailTableView.estimatedRowHeight = 200 
    courseDetailTableView.rowHeight = UITableViewAutomaticDimension 
} 

그리고 staticCell와 함께있는 tableView의 대리자를 사용하여 :

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

그러나이 정적 셀의 높이

정말 작은 ... 그것은 자동 레이아웃은 설정 할 수 없다는 것을 의미 내가 설정 한 제약 조건만으로 그의 콘텐츠의 높이를 계산했습니다. 나는 제약 조건만을 말했습니다. 왜냐하면 높이를 400과 같은 높이로 설정 한 containerView의 contentView에 하나 이상의 제약 조건을 설정하면 해당 셀의 높이는 400입니다.

나는 자동 설정을 사용하여 헤이를 설정하는 방법이 있는지 궁금합니다. 컨테이너의 높이와 일치하는 정적 셀의 ght.

내가 아마 처음 containerView의 높이를 계산하고이 가능 작업 나는 간단한 방법

가 있는지 알고 싶어 할 수있는 heightForRow을 설정하려면이 키를 사용하여 대리자를 사용하는 것을 알고는 정말 고마워요 .

+0

왜 컨테이너 대신 ContainerView를 사용하는지, 정적 셀에 UITableViewController가 포함되어 있는지, UITableViewController를 사용하는 이유는 무엇입니까? –

+0

안녕하세요 @ TarasChernyshenko 나는이 모든 것을 여기에 포장해야하는 것이 조금 혼란 스럽다는 것을 알고 있습니다. 그러나 이것은 다른 버전과 하나의 컨트롤러 옆에 두 개의 tableview가있는 최신 버전에 필요하기 때문에입니다. 이제는 이해가 안되지만 나중에이 방법이 더 쉬울 것입니다 (최소한 나는 그렇게 생각합니다) – neteot

답변

0

그냥 같은 문제에 직면 한 사람을 위해 내 자신의 질문에 대답하고 싶습니다. 정적 셀을 사용할 필요는 없습니다.이 대답은 정적 셀뿐만 아니라 동적 셀에도 적용됩니다.

당신이해야 할 일은 마스터 뷰 컨트롤러에서 다음

func tableViewHeight() -> CGFloat { 
    tableView.layoutIfNeeded() 
    return tableView.contentSize.height 
} 

합니다 ((layoutIfNeeded을 요청하는 것을 잊지 마세요) 속성 또는 높이를 계산하는 방법을 설정 containerViewController에 그럼 그냥 물어

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "containerSegue" { 
     guard let containerVC = segue.destination as? SessionCoordinatorController else { return } 
     sessionController = containerVC 
    } 
} 

을 : 셀이 하나있는 당신은과 같이 SEGUE 방법을 준비에 예를 들어 containerViewController에 대한 참조를 저장해야합니다) 임베디드 containerViewController입니다 합니다 (masterViewController에서)과 같이 jQuery과 heightForRowAt의 대리자 메서드의 컨테이너 높이 :

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    guard let height = sessionController?.tableViewHeight() else { return UITableViewAutomaticDimension } 
    return height 
} 

그리고 그것 뿐이다

containerViewController

에서 false로 tableView.isScrollEnabled를 추가하는 것을 잊지 마세요
0

그래서 내가 제대로 이해한다면 당신은 실제로 그 제약이 :

  • ContentView.bottom = ContainerView.bottom
  • ContentView.trailing = ContainerView.trailing + 표준
  • ContainerView.leading = ContentView.leading + 표준
  • ContainerView.top = ContentView.top

기본적 WH 원하는 경우이 제약 조건이 있습니다 :

  • ContentView.height = ContainerView.height right? 그러나 당신이 그것을 넣으면 당신은 매우 작은 세포를 가집니까?

는이 같은 containerView에 대한 높이의 최소를 해결하기 위해 제약 조건을 넣어 시도 할 수 있습니다 그렇다면 :

  • ContainerView가.

    • ContentView.height = ContainerView.height (우선 순위 249 : 예를 들어 다음

    당신이 동일한 높이에 대한 선택적인 제약을 넣어 시도 할 수 있습니다에 대한 높이 높이> = 400 // 적어도 400 또는 낮은)을 "이있는 contentView가 containerView을 계속하지 않을 경우 높이와 대략 그것에 일치하는 경우 나는이 여분의 제약 조건을 가지고, 그것은 잘 될 것입니다"라고하는 제약 조건의 우선 순위를 낮추는 방법으로

.

여기에 자동 레이아웃 AutooLayout Understanding

P.S에 대한 자세한 정보입니다 : heightForRowAtIndexPath : automaticDimension를 반환하여 위임 방법 당신은있는 tableView을 구현할 필요가 없습니다.

+0

내가 필요로하는 것은 정적 셀이 containerView (컨테이너 뷰가 UITableViewController)에 내장 된 컨테이너의 높이에 맞게 늘리는 것입니다. 수동으로 높이 제한을 설정하면 자동 레이아웃을 사용하여이를 수행하고 싶지만 contentView의 높이를 모르기 때문에 이것을 원하지 않습니다. 얼마나 많은 셀을 가지고 있느냐에 따라 달라집니다 – neteot

+0

ContainerView.height> = 400 // 예를 들어 높이가 400 이상인 경우 다음과 같은 높이에 대해 선택적 제약 조건을 적용 할 수 있습니다. ContentView.height = ContainerView.height (priority 249 or low) – Arrabidas92

+0

안녕하세요 @ Arrabidas92 감사하지만 제안 된 솔루션이 작동하지 않습니다. https://imgur.com/a/Ijg50 UITableView 높이가 0 인 UIScrollView 높이와 같기 때문에 높이가 결코 400 이상이 아니기 때문에 (실제로는 그렇다) 생각합니다. 나는 가야한다고 생각합니다. 다른 접근 방식으로 : / – neteot