programing

제약 조건이 0의 높이를 모호하게 제시하는 경우를 감지함

goodsources 2023. 5. 11. 21:24
반응형

제약 조건이 0의 높이를 모호하게 제시하는 경우를 감지함

테이블 보기 셀이 포함된 앱을 실행할 때 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를 사용했을 때 몇 가지 오류가 발생했지만 업그레이드 후 오류가 사라졌습니다.저는 지금 다른 오류나 경고가 없습니다.이미 모든 테이블 뷰 셀의 크기를 조정하고 표준 높이를 사용하려고 시도했지만 여전히 동일한 경고가 표시됩니다.

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.

저는 또한 이와 관련된 모든 유사한 주제를 읽었지만 그들의 솔루션 중 어느 것도 도움이 되지 않습니다.시뮬레이터로 앱을 테스트하면 테이블에 있어야 할 사진을 제외하고 앱이 정상적으로 실행됩니다.

iOS8의 Table Views에서 환상적인 새로운 기능의 부작용을 경험하게 될 것입니다.자동 행 높이.

7에서는 된 행(iOS 7과 설정)이 있었습니다.tableView.rowHeight에 합니다.tableView:heightForRowAtIndexPath셀에 여러 보기가 있고 글꼴 크기에 따라 고려해야 할 높이가 다른 경우 셀 높이 계산을 위한 코드 작성이 매우 복잡할 수 있습니다.다이나믹 타입을 추가하면 그 과정은 골치아팠습니다.

iOS 8에서는 위와 같은 작업을 계속할 수 있지만, 이제 자동 레이아웃을 사용하여 셀 내용을 구성한 경우 iOS에서 행의 높이를 결정할 수 있습니다.동적 글꼴 크기가 변경되거나 사용자가 내게 필요한 옵션 설정을 사용하여 텍스트 크기를 수정하면 UI가 새 크기에 적응할 수 있기 때문에 개발자에게 매우 유용합니다.또한 여러 줄의 텍스트를 포함할 수 있는 UI 레이블이 있으면 셀이 필요할 때 셀을 확장하고 필요하지 않을 때 축소할 수 있으므로 불필요한 공백이 없습니다.

자동 레이아웃에 대한 제약 조건이 셀 높이를 표 보기에 알리기에 충분하지 않다는 경고 메시지가 표시됩니다.

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

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

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

  2. UI는 위치 제약 조건에 따라 배치됩니다.라벨의 하단에는 셀의 하단 여백에 연결되는 제약 조건이 있습니다.라벨이 120 포인트 높이로 성장하고, 제약 조건에 의해 셀의 하단에 결합되기 때문에, "라벨의 하단은 항상 셀의 하단으로부터 표준 거리입니다."라는 제약 조건을 만족시키기 위해 셀을 "아래로"(셀의 높이를 증가시킵니다)해야 합니다.

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

동적 행 하는 경우 iOS tableView:estimatedHeightForRowAtIndexPath:이 추정 방법은 셀에 대략적인 값을 사용할 수 있으며 테이블 뷰가 처음 로드될 때 호출됩니다.UIKit는 스크롤 막대와 같은 것을 그릴 수 있습니다. 테이블 뷰가 스크롤할 수 있는 콘텐츠의 양을 알지 못하면 그릴 수 없지만 스크롤 막대이기 때문에 완전히 정확한 크기는 필요하지 않습니다.이렇게 하면 셀이 필요할 때까지 실제 행 높이 계산을 연기할 수 있으므로 계산 집약적이지 않고 UITableView를 더 빨리 표시할 수 있습니다.

지금까지 세 가지가 이 경고를 잠재우는데 성공했습니다.당신은 당신에게 가장 편리한 것을 픽업할 수 있습니다.예쁜 건 없어요.

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

    self.tableView.rowHeight = 44;
    
  • 스토리보드로 이동하여 테이블 보기의 행 높이를 44와 다른 값으로 변경합니다.

  • 테이블 뷰의 대리자 메서드 높이ForRowAt를 구현하려면인덱스 경로

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

이상하다.

프로그래밍 방식 없이 이 문제를 해결하려면 스토리보드에서 크기 관리자의 표 보기 행 높이를 조정합니다.

여기에 이미지 설명 입력

사용자 지정을 생성한 후 이 문제가 발생했습니다.UITableViewCell그리고 세포에 그것의 대신에 내 서브뷰를 추가합니다.contentView.

이것은 자동 레이아웃 문제입니다.하위 보기에 모든 제약 조건이 있는지 확인합니다.셀에서 제목 레이블에 대한 하단 제약 조건이 누락되었습니다.제가 그것을 덧붙이자, 경고는 사라지고 모든 것이 완벽하게 나타났습니다.

자체 크기 조정 테이블 보기 셀 사용

   tableView.estimatedRowHeight = 85.0
   tableView.rowHeight = UITableViewAutomaticDimension

의 모든 측면에 제약 조건을 추가했는지 확인합니다.UITableViewCell…로서

여기에 이미지 설명 입력

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

저는 오늘 이 경고를 받았습니다.(인터페이스 빌더에서) 이것이 저를 사라지게 한 이유입니다.

1.테이블 뷰의 행 높이 필드를 442가 아닌 다른 값으로 설정테이블의 행 높이 필드 설정셀 보기

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

저의 경우, 저는 프로그래밍 방식으로 셀을 만들고 있었는데 이 오류가 계속 발생했습니다.

나는 하위 뷰와 제약 조건을 추가하고 있었습니다.UITableViewCellinit다음과 같은 방법:

addSubview(rankingLabel)
addConstraints(cellConstraints)

나는 그것들을 셀의 문서에 추가하여 문제를 해결했습니다.contentView대신:

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

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

여기에 이미지 설명 입력

tableView에 대한 Custom tableViewCell을 작성한 경우 셀에 하단 및 상단 제약 조건을 모두 지정했는지 확인합니다.또한 사용자 지정 셀 내부의 하위 뷰가 중앙 Y에 정렬되어 있으면 오류 메시지가 표시되지 않지만 첨부한 이미지처럼 테이블 뷰에 대한 행 높이를 식별하는 데 방해가 될 수 있습니다. 여기에는 상단하단 제약 조건이 모두 있습니다.

테이블용 사용자 지정 셀을 작성할 때 셀 내부의 사용자 지정 셀 하위 뷰에 대해 행 높이 또는 상단 및 하단 제약 조건을 지정해야 합니다(예: 아래 이미지와 같은 사용자 지정 셀의 레이블).

그러나 이 방법이 작동하지 않으면 이 이미지처럼 자동으로 설정하는 대신 셀의 행 높이를 설정할 수 있습니다.

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

오늘 이 경고를 받았습니다. 코드에 한 줄을 추가한 것뿐입니다.

tableView.rowHeight = 200;

내부에 이 코드 라인을 추가합니다.

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

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

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

이 코드는 테이블 행 셀 높이를 200으로 증가시킵니다. 기본 높이는 44입니다.

저도 Xcode 6 GM으로 이동하면서 이 경고를 경험했습니다.장치를 원래 위치로 회전시켰을 때만 경고를 받고 있었습니다.

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

위의 아이디어들 외에도, 나는 이것을 추가했습니다.

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

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

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

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

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

사용자 정의 테이블 ViewCell의 레이블과 뷰가 ContentView가 아닌 customCell로 제한되었을 때 이 문제가 발생했습니다.제약 조건을 제거하고 셀 Content View에 연결하자 문제가 해결되었습니다.

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

동적 행 높이를 갖는 사용자 정의 테이블 뷰 셀에 대해서도 비슷한 문제가 있습니다.동적 높이가 반영되지 않고 콘솔에서 동일한 경고를 받았습니다.솔루션은 contentView 대신 셀에 하위 보기를 추가하는 것입니다.그나저나, 저는 프로그램적으로 하위 뷰를 만들었습니다.

이 문제가 있습니다.TableViewCells 초기화 시 제약 조건이 설정되어 있지만 셀 내용물이 나중에 로드되는 경우, 이는 자동 레이아웃 엔진이 높이를 결정할 수 없음을 의미합니다.여기 있는 다른 해결책은 작동하지 않습니다. 왜냐하면 저는 세포의 높이가 필요하기 때문입니다.UITableView.automaticDimension.

나는 단지 세포에 추가적인 제약조건을 추가했습니다.

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

스토리보드에서 다음을 설정합니다.cell Row height값이 같은 필드Row heighttableView(둘 다 같은 값으로 나에게 효과가 있었습니다.)

추가하는 경우heightForRowAtIndexPath당신의 코드에 대한 기능은 각 셀에 대해 호출될 것이기 때문에 성능 문제를 유발할 수 있으므로 주의하십시오.

동적 높이 계산을 수행하는 경우

  • 위와 아래와 같은 제약 조건에서 모든 요소가 서로 연결되어 있어야 합니다.
  • 당신은 분명히 당신의 셀의 하단에 있는 요소와 연결된 하단 제약 조건을 가지고 있어야 합니다.

UITableView를 사용하여 ViewController 클래스를 확장하고 탐색 컨트롤러를 사용하여 화면을 표시하는 경우 식별자를 사용하여 segue를 수행할 필요가 없습니다. 이 경우 식별자 ViewController의 오류가 발생할 수 있습니다.이 오류를 제거하기 위해 pushViewController 메서드를 사용하여 채팅 화면을 표시할 수 있으므로 코드는 UItableView 대리자에게 붙여넣기만 하면 됩니다.

let chatBox = ChatBoxViewController() 탐색 컨트롤러?pushViewController(chatBox, 애니메이션: true)

다음에 표시할 뷰 컨트롤러의 이름을 입력하면 됩니다.

저도 같은 오류가 있습니다, 이 라인으로 인해 이 오류가 표시되었습니다.

self.layer.backgroundColor = UIColor(화이트:1,알파:0.2) as! CGColor

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

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

언급URL : https://stackoverflow.com/questions/25902288/detected-a-case-where-constraints-ambiguously-suggest-a-height-of-zero

반응형