제약 조건이 높이 0을 모호하게 제안하는 경우 감지


120

tableview 셀이 포함 된 앱을 실행할 때 Xcode 6.1 베타 2로 업데이트 한 후 디버그 도우미가 다음과 같이 말합니다.

Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.

이전에이 프로젝트에서 Xcode 5를 사용했을 때 몇 가지 오류가 발생했지만 업그레이드 한 이후로 사라졌습니다. 지금은 다른 오류나 경고가 없습니다. 이미 모든 tableview 셀의 크기를 조정하고 표준 높이를 사용해 보았지만 여전히 동일한 경고가 표시됩니다.

Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.

나는 또한 이것에 대한 모든 유사한 주제를 읽었지만 그들의 솔루션은 도움이되지 않습니다. 시뮬레이터로 앱을 테스트하면 tableView 셀에 있어야하는 그림이없는 경우를 제외하고 앱이 정상적으로 실행됩니다.


2
컬렉션 뷰 셀에 대해 동일한 오류가 발생합니다. 내가하는 일. 모든 제안.
파이썬

xib 파일을 대상에 이미 추가했는지 확인해야합니다. stackoverflow.com/a/26870331/1418457
onmyway133


이것은 iOS 8.1에서 나에게 발생했지만 더 이상 iOS 8.4에서는 발생하지 않았습니다. 높이를 지정했다면 Xcode 버그 일뿐입니다.
samwize

답변:


126

지금까지 세 가지가이 경고를 침묵 시켰습니다. 가장 편리한 것을 선택할 수 있습니다. 그래도 예쁜 것은 없습니다.

  • viewDidLoad에서 기본 셀의 높이를 설정하려면

    self.tableView.rowHeight = 44;
  • 스토리 보드로 이동하여 tableview의 행 높이를 44가 아닌 다른 것으로 변경하십시오.

  • tableview의 대리자 메서드 heightForRowAtIndexPath를 구현하려면

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return 44;
    }

기묘한.


나는 또한 당신의 방법을 사용해 보았지만 rowHeight에 대해 @property를 추가해야하지만 사용할 올바른 개체 유형을 모릅니다
David E

메모를받지 못했을 수도 있지만 rowHeight는 UITableView의 속성입니다. 테이블을 콘센트에 연결하기 만하면됩니다.
Viktor Kucera 2014 년

4
IB에서 44pt 값을 유지하면 자체 크기 조정 셀을 사용하려는 것으로 간주되기 때문입니다. stackoverflow.com/questions/25888126/… (그러나 예, 이것은 참으로 이상한 행동입니다)
Guillaume Algis 2014 년

그래서 분명히 두 개의 viewDidLoad 메서드가 있었고 self.tableView.rowHeight = 44;잘못된 메서드에 넣었습니다 . 오류가 사라졌습니다! 감사
데이비드 E

이것을 더 명확하게 해준 Guillaume Algis에게 감사드립니다. 그래도 여전히 매우 오싹합니다.
Viktor Kucera 2014 년

216

iOS8의 Tableviews : Automatic Row Heights의 환상적인 새로운 기능의 부작용이 있습니다.

iOS 7에서는 고정 된 크기의 행 (로 설정 tableView.rowHeight)이 있거나 셀의 높이를 계산하는 코드를 작성하여 tableView:heightForRowAtIndexPath. 셀에 많은 뷰가 있고 다른 글꼴 크기에서 고려할 높이가 다른 경우 셀 높이 계산을위한 코드를 작성하는 것은 매우 복잡 할 수 있습니다. Dynamic Type을 추가하고 프로세스는 엉덩이에 고통이었습니다.

iOS 8에서도 위의 작업을 수행 할 수 있지만 이제는 자동 레이아웃을 사용하여 셀의 콘텐츠를 구성한 경우 iOS에서 행 높이를 결정할 수 있습니다. 동적 글꼴 크기가 변경되거나 사용자가 접근성 설정을 사용하여 텍스트 크기를 수정하면 UI가 새로운 크기에 적응할 수 있기 때문에 이는 개발자에게 큰 이점입니다. 또한 여러 행의 텍스트를 포함 할 수있는 UILabel이있는 경우 이제 셀이 필요할 때이를 수용하도록 셀을 확장 할 수 있고 그렇지 않을 때 축소 할 수 있으므로 불필요한 공백이 없습니다.

표시되는 경고 메시지는 자동 레이아웃에 대한 셀의 제약 조건이 충분하지 않아 테이블 뷰에 셀 높이를 알리는 것입니다.

다른 포스터에서 이미 언급 한 기술과 함께이 메시지를 제거하는 동적 셀 높이를 사용하려면 셀에 UI 항목을 셀 의 상단 과 하단 에 바인딩하기에 충분한 제약 조건이 있는지 확인해야합니다 . 이전에 자동 레이아웃을 사용한 적이 있다면 Top + Leading 제약 조건을 설정하는 데 익숙 할 것입니다.하지만 동적 행 높이에도 아래쪽 제약 조건이 필요합니다.

레이아웃 단계는 다음과 같이 작동하며, 화면에 셀이 적시에 표시되기 직전에 발생합니다.

  1. 고유 크기가있는 콘텐츠의 크기가 계산됩니다. 여기에는 UILabels 및 UIImageViews가 포함되며, 여기에서 크기는 각각 포함 된 텍스트 또는 UIImage를 기반으로합니다. 이 두 뷰는 모두 너비를 알려진 것으로 간주합니다 (후행 / 선행 가장자리에 대한 제약 조건을 설정했거나 명시 적 너비를 설정했거나 결국 가로 제한을 사용하여 좌우로 너비를 표시했기 때문). 레이블에 텍스트 단락이 있다고 가정 해 보겠습니다 ( "줄 수"가 0으로 설정되어 자동 줄 바꿈 됨). 310 포인트 만 가능하므로 현재 글꼴 크기에서 120pt 높이로 결정됩니다.

  2. UI는 위치 제약에 따라 배치됩니다. 셀의 아래쪽 여백에 연결되는 레이블 아래쪽에 제약 조건이 있습니다. 레이블이 120 포인트 높이로 성장하고 제약 조건에 의해 셀의 맨 아래에 바인딩되었으므로 "bottom of"라는 제약 조건을 충족하려면 셀을 "아래로"(셀 높이 증가) 밀어야합니다. 레이블은 항상 셀 하단에서 표준 거리입니다.

보고 한 오류 메시지는 아래쪽 제약 조건이 누락 된 경우 발생합니다.이 경우 셀 맨 아래를 셀 맨 위에서 "밀어 낼"것이 없습니다. 이는보고 된 모호성입니다. 맨 아래를 밀지 않습니다. 상단, 셀이 무너집니다. 그러나 자동 레이아웃도이를 감지하고 표준 행 높이를 사용하는 방식으로 돌아갑니다.

가치가 있고 대부분 반올림 된 답변을 얻으려면 iOS 8의 자동 레이아웃 기반 동적 행 높이를 구현하는 경우 tableView:estimatedHeightForRowAtIndexPath:. 이 추정 방법은 셀에 대한 대략적인 값을 사용할 수 있으며 테이블보기가 처음로드 될 때 호출됩니다. UIKit이 스크롤바와 같은 것을 그리는 데 도움이되는데, 이는 tableview가 스크롤 할 수있는 콘텐츠의 양을 알지 못하면 그릴 수 없지만 스크롤바 일 뿐이므로 완전히 정확한 크기는 필요하지 않습니다. 이렇게하면 셀이 필요한 순간까지 실제 행 높이의 계산을 연기 할 수 있습니다. 이렇게하면 계산 집약적이지 않고 UITableView가 더 빨리 표시됩니다.


3
이것은이 경고의 근본 이유에 대한 훌륭한 설명입니다. 시간 동안 많이 들으십시오, Woodster!
Golden Thumb

4
Woodster가 말한 것처럼 저는 제약 조건의 .Bottom 부분을 놓쳤습니다. 추가되면 내 문제가 해결되었습니다.
Golden Thumb

거의 20 가지를 시도한 후에 이것이 효과가 있었던 유일한 것입니다!
Julio Rodrigues

이 남자가 못 박았다! 그는 자격이 있고 찬성표를 던지며 이것이 받아 들여진 대답이어야합니다. +1
caribbean

1
제약 조건이 누락 된 셀을 파악하려면 이 답변 stackoverflow.com/a/29565073/4080860 을 참조하십시오 .
hhanesand 2015-07-30

11

사용자 지정을 만들고 UITableViewCell내 하위보기를 셀 대신 셀에 추가 한 후이 문제가 발생 했습니다 contentView.


10

프로그래밍 방식없이이 문제를 해결하려면 스토리 보드의 크기 검사기에서 테이블보기의 행 높이를 조정하십시오.

여기에 이미지 설명 입력


저에게 가장 좋은 해결책은 코드 줄 대신 스토리 보드를 사용하는 것입니다.
zyc

6

이것은 자동 레이아웃 문제입니다. 서브 뷰에 모든 제약이 있는지 확인하십시오. 나를 위해 셀의 제목 레이블에 대한 하단 제약 조건이 누락되었습니다. 그것을 추가했을 때 경고가 사라지고 모든 것이 완벽하게 나타났습니다.


이것이 완벽하게 좋은 대답이기 때문에 왜 이것이 반대표를 받았는지 모르겠습니다. 레이아웃에 문제가있는 셀을 파악하는 데 도움이 필요하면 여기를 참조하십시오. stackoverflow.com/a/29565073/4080860
hhanesand 2015-07-30

5

자체 크기 조정 테이블보기 셀을 활성화하기 만하면됩니다.

   tableView.estimatedRowHeight = 85.0
   tableView.rowHeight = UITableViewAutomaticDimension

& UITableViewCellas-의 모든면에 제약 조건을 추가했는지 확인하십시오.

여기에 이미지 설명 입력


실제로 self-sizig tableview 셀을 비활성화 하면 경고가 사라졌습니다 .
turingtested

@turingtested 다양한 장치에서 지원을 제공하기 위해 자체 크기 조정 테이블 뷰 셀을 활성화해야합니다.
Jack

동의하지만 원래 질문을 읽으십시오. 내가 의미 한 것은 당신이 제안한 솔루션이 적어도 나를 위해 작동하지 않았다는 것입니다.
turingtested

참고 UITableViewAutomaticDimension로 이름이 바뀌 었습니다UITableView.automaticDimension
atineoSE

5

정적 셀 또는 동적 셀을 사용하는 경우 검사자 테이블의 테이블보기에 행 높이를 추가하고 행 높이의 오른쪽에 자동을 선택 취소하면이 경고가 더 이상 표시되지 않습니다.여기에 이미지 설명 입력


그 반대가 더 효과적이라는 것을 알았습니다. 명시적인 예상 높이를 설정하고 행 높이 자체를 자동으로 설정하는 것입니다.
NRitH

4

오늘이 경고를 받았습니다. 나를 위해 사라진 이유는 다음과 같습니다 (인터페이스 빌더에서)

1. 테이블 뷰의 행 높이 필드를 44 이외의 값으로 설정 2 tableView 셀의 행 높이 필드를 44 이외의 값으로 설정

코드를 변경할 필요가 없었습니다.


3

제 경우에는 프로그래밍 방식으로 셀을 구축하고 있었고이 오류가 계속 발생했습니다.

다음 과 같이 UITableViewCellinit메서드 에 하위 뷰와 제약 조건을 추가 했습니다.

addSubview(rankingLabel)
addConstraints(cellConstraints)

contentView대신 셀에 추가하여 문제를 해결했습니다 .

contentView.addSubview(rankingLabel)
contentView.addConstraints(cellConstraints)

1
항상 직접이 contentView아닌에 하위보기를 추가하십시오 UITableViewCell.
dinesharjani

3

예상 행 높이를 0으로 설정하면 경고가 사라집니다.

여기에 이미지 설명 입력


진짜 문제는 어딘가에 제약이 없다는 것입니다. 당신은 아마 대신 설정을 위 / 아래 제약 수직으로 뭔가를 입력하는
TruMan1

1

나도 Xcode 6 GM으로 이동하면서이 경고를 경험했습니다. 장치를 원래 위치로 되 돌렸을 때만 경고를 받았습니다.

사용자 지정 UITableViewCells를 사용하고 있습니다. 스토리 보드 테이블보기는 내 사용자 지정 크기 (내 경우에는 100.0)로 설정됩니다. 이전 릴리스에서와 같이 테이블 셀이 제대로 렌더링되지만 경고 메시지가 마음에 들지 않았습니다.

위의 아이디어에 덧붙여서

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 100.0;
}

화면 렌더링 ... 회전에 응답하고 더 이상 경고 메시지가 표시되지 않습니다.


그래서 나는 당신이 나에게 준 줄을 사용하여 당신의 방법을 사용해 보았지만 여전히 같은 오류가 발생합니다. 나는 또한 내 앱에서 회전을 사용하지 않았습니다.
David E

1

xcode 6.0.1에서는 다음을 사용하여 행 높이를 지정하는이 경고를 제거했습니다.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 44.0;
}

1

tableView에 대한 사용자 정의 tableViewCell을 만든 경우 셀에 하단 및 상단 제약 조건을 모두 지정했는지 확인하십시오. 사용자 정의 셀 내부의 하위 뷰 가 오류 메시지를 표시하지 않지만 엉망이되는 중앙 Y에 정렬되어 있으면이 메시지가 나타날 수도 있습니다. 내가 첨부 한 Image에서와 같이 tableview의 행 높이를 차례로 식별 하면 여기에 상단 및 하단 제약 조건이 있습니다.

tableView에 대한 사용자 지정 셀을 만들 때 셀 내부에 사용자 지정 셀의 하위보기에 대한 특정 행 높이 또는 위쪽 및 아래쪽 제약 조건을 지정해야합니다 (예 : 아래 이미지와 같은 사용자 지정 셀의 레이블).

그러나 이것이 작동하지 않으면 이 이미지와 같이 자동 대신 셀의 행 높이를 설정할 수 있습니다.

그러나 자동 체크를 끄면 자동으로 수행 될 수있는 변경 사항에 대해 행 크기를 프로그래밍 방식으로 조정해야합니다.


0

스토리 보드에서 설정 cell Row height과 같은 값으로 필드 Row heighttableView(나를 위해 일한 값이 같은 두).

heightForRowAtIndexPath코드 에 함수를 추가하면 각 셀에 대해 호출되므로 성능 문제가 발생할 수 있으므로주의해야합니다.


0

모든 항목을 수직으로 정렬하도록 유일한 제약 조건이 설정되어 있고 셀에 대해 높이를 지정하지 않았거나 원하지 않는 경우에도이 메시지가 표시 될 수 있습니다. 항목에 상하 제약을 설정하면 경고가 사라집니다.


0

사용자 정의 tableViewCell의 레이블 및보기가 Content View가 아닌 ​​customCell로 제한되었을 때이 문제가 발생했습니다. 제약 조건을 지우고 콘텐츠보기 셀에 연결하면 문제가 해결되었습니다.


0

동일한 오류 메시지가 나타났습니다. 모든 콘센트가 테이블 뷰 및 테이블 뷰 제약 조건과 같이 유효한지 확인하십시오.


0

동적 높이 계산을하는 경우

  • 모든 요소가 상단 및 하단과 같은 제약 조건에서 서로 연결되어 있어야합니다.
  • 셀 하단의 요소에 연결된 하단 제약 조건이 있어야합니다.

0

동적 행 높이가있는 사용자 정의 tableview 셀에 대해서도 비슷한 문제가 있습니다. 동적 높이가 반영되지 않았고 콘솔에서 동일한 경고를 받았습니다. 해결책은 contentView 대신 셀에 하위보기를 추가하는 것입니다. BTW, 프로그래밍 방식으로 하위 뷰를 만들었습니다.


0

TableViewCell초기화에 제약이 설정되어 있지만 나중에 셀 내용이로드되는 경우에이 문제가 발생합니다 . 이것은 자동 레이아웃 엔진이 높이를 결정할 수 없음을 의미합니다. 여기에있는 다른 솔루션은 셀의 높이가 UITableView.automaticDimension.

방금 셀에 추가 제약 조건을 추가했습니다.

contentView.heightAnchor.constraint(equalToConstant: 44, priority: .defaultLow)

0

오늘이 경고를 받았습니다. 코드에 한 줄만 추가하면됩니다.

tableView.rowHeight = 200;

이 코드 줄을

func tableView(_ tableView: UITableView, numberOfRowsInSection section:Int) -> Int {
  ...
}

최종 코드는 다음과 같습니다.

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  tableView.rowHeight = 200;
  ...
}

이 코드는 테이블 행 셀 높이를 200으로 늘리고 기본 높이는 44입니다.


-1

이 줄로 인해이 오류가 표시되었습니다.

self.layer.backgroundColor = UIColor (white : 1, alpha : 0.2) as! CGColor

오류를 수정하기 위해 다음과 같이 줄을 변경합니다.

self.layer.backgroundColor = UIColor (흰색 : 1, 알파 : 0.2) .cgColor

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.