[ios] 8.0 이전의 iOS 버전에서는 자동 기본 최대 레이아웃 너비를 사용할 수 없습니다.

Xcode6 beta6으로 기존 iOS 프로젝트를 열었고 Xcode는 Storyboard 및 Xib 파일 모두에 대해 다음 경고를 나열합니다.

8.0 이전의 iOS 버전에서는 자동 기본 최대 레이아웃 너비를 사용할 수 없습니다.

아래와 같이 너비를 명시 적으로 설정하여 경고를 해결하려고했습니다.

그러나 이것은 경고를 해결하지 못했습니다. 그것들을 어떻게 제거 할 수 있습니까?



답변

업데이트 3 : 배포 대상이 7.1로 설정된 경우 1 이외의 값으로 설정된
레이블에 의해이 경고가 트리거 될 수도 있습니다 numberOfLines. 이것은 새로운 단일 뷰 프로젝트로 완전히 재현 가능합니다.

재현 단계 :

  1. 새로운 단일 뷰, objective-c 프로젝트 만들기
  2. 배포 대상을 7.1로 설정
  3. 프로젝트 스토리 보드 열기
  4. 제공된 뷰 컨트롤러에 레이블을 놓습니다.
  5. 해당 레이블의 numberOfLines를 2로 설정하십시오.
  6. 엮다

다음 레이더를 제출했습니다 :
rdar : // problem / 18700567

업데이트 2 :
불행히도, 이것은 Xcode 6의 릴리스 버전에서 다시 한 번 발생합니다. 대부분 문제를 해결하기 위해 스토리 보드 / xib를 수동으로 편집 할 수 있습니다. 아래의 의견에서 Per Charles A . :

우연히이 경고를 쉽게 소개 할 수 있으며 경고 자체는 범인이라는 레이블을 찾는 데 도움이되지 않습니다. 복잡한 스토리 보드에서는 불행합니다. 스토리 보드를 소스 파일로 열고 정규식 <label(?!.*preferredMaxLayoutWidth)으로 검색 하여 preferredMaxLayoutWidth 속성 / 값이 생략 된 레이블을 찾을 수 있습니다. 이러한 행에 preferredMaxLayoutWidth = “0”을 추가하면 명시 적으로 표시하고 값을 0으로 설정하는 것과 같습니다.

업데이트 1 :
이 버그는 Xcode 6 GM에서 수정되었습니다.

원래 답변
이것은 Xcode6-Beta6 및 XCode6-Beta7의 버그이며 현재로서는 무시해도됩니다.

Apple 개발자 포럼의 Apple 엔지니어 는 버그에 대해 다음 과 같이 말했습니다.

기본 최대 레이아웃 너비는 UILabel의 자동 레이아웃 속성으로 컨텐츠에 맞게 자동으로 세로로 커질 수 있습니다. 6.0 이전의 Xcode 버전은 디자인 타임에 여러 줄 레이블에 대한 maximumMaxLayoutWidth를 현재 경계 크기로 설정했습니다. 가로 레이아웃이 변경된 경우 런타임에 preferredMaxLayoutWidth를 수동으로 업데이트해야합니다.

iOS 8은 런타임에 preferredMaxLayoutWidth를 자동으로 계산하는 기능을 추가하여 여러 줄 레이블을 훨씬 쉽게 만들 수 있습니다. 이 설정은 iOS 7과 역 호환되지 않습니다. iOS 7 및 iOS 8을 모두 지원하기 위해 Xcode 6을 사용하면 크기 검사기에서 preferredMaxLayoutWidth에 대해 “자동”또는 “명시 적”을 선택할 수 있습니다. 당신은해야합니다 :

최상의 경험을 위해 iOS 8을 대상으로하는 경우 “자동”을 선택하십시오. <iOS 8을 타겟팅하는 경우 “명시 적”을 선택하십시오. 그런 다음 설정하려는 preferredMaxLayoutWidth의 값을 입력 할 수 있습니다. “명시 적”을 활성화하면 기본적으로 상자를 선택할 때 현재 범위 크기가 설정됩니다.

(1) 자동 레이아웃을 사용하고 (2) 여러 줄 레이블에 대해 “자동”을 설정 한 경우 [라벨의 크기 관리자에서이를 확인할 수 있음] 및 (3) 배포 대상 <iOS 8.

이 경고는 자동 레이아웃이 아닌 문서에 나타납니다. 이 경고가 표시되고 자동 레이아웃을 사용하지 않으면 경고를 무시할 수 있습니다.

또는 문제의 스토리 보드 또는 xib에서 파일 관리자를 사용하여 문제를 해결하고 “빌드 대상”을 “iOS 8.0 이상의 빌드”로 변경하십시오.
Xcode 파일 관리자


답변

큰 스토리 보드에서 문제 레이블을 찾으려면 아래 단계를 따르십시오.

  1. xCode의 이슈 탐색기에서 오류를 마우스 오른쪽 버튼으로 클릭하고 “로그에 공개”를 선택하십시오. (참고 : @Sam은 아래에서 xCode의 보고서 탐색기를 참조하십시오 . 또한 @Rivera는 “Xcode 6.1.1에서 경고를 클릭하면 자동으로 열리고 충돌하는 레이블이 강조 표시됩니다.”라는 주석에서 주석을 작성합니다. ).

여기에 이미지 설명을 입력하십시오

  1. 스토리 보드 파일의 끝에 코드와 함께 오류가 표시됩니다. .storyboard 뒤에 값을 복사하십시오.

여기에 이미지 설명을 입력하십시오

  1. 다음으로 스토리 보드를 소스 파일로 공개하십시오.
    여기에 이미지 설명을 입력하십시오

  2. 검색. 내용을 보면 여기에서 어떤 레이블인지 쉽게 알 수 있어야합니다.
    여기에 이미지 설명을 입력하십시오

레이블을 찾으면 나를 위해 일한 솔루션은 “선호 너비”를 0으로 설정하는 것이 었습니다.

여기에 이미지 설명을 입력하십시오

BTW에서는 항상 항목을 선택하고 식별 관리자 아래에서 인터페이스 항목의 ID를 신속하게 얻을 수 있습니다. 매우 편리합니다.

여기에 이미지 설명을 입력하십시오


답변

스토리 보드를 소스로 열지 않고도이 문제 해결할 수 있습니다 . numberOfLines! = 1이고 배치 대상이 <8.0 인 경우 UILabels에 의해이 경고가 트리거됩니다.

그것을 찾는 방법?

  1. 이슈 탐색기 (CMD + 8)로 이동하여 경고와 함께 최신 빌드를 선택하십시오.
    여기에 이미지 설명을 입력하십시오
  2. 경고를 찾고 ( ” 자동 기본 최대 레이아웃 “검색) 오른쪽의 확장 버튼을 누릅니다.
    여기에 이미지 설명을 입력하십시오
  3. UILabel
    의 객체 ID 찾기여기에 이미지 설명을 입력하십시오
  4. 개체에 대한 스토리 보드 및 검색 (CMD + f)을 엽니 다 . 그것은 것 SELECT 강조 UILabel의를
  5. 다른 사람이 제안한대로 기본 너비 = 0 “명시 적” 으로 설정

답변

해결책은 매우 간단합니다

iOS 8 이상에서 빌드를 사용하도록 설정하십시오.

여기에 이미지 설명을 입력하십시오


답변

이제 내 Xcode 버전은 6.1입니다. 그러나 나는이 경고도 받았다. 그것은 나를 많이 귀찮게합니다. 몇 번이고 검색 한 후 해결책을 찾았습니다.

이유 : 스토리 보드에서 UILabel Lines> 1을 설정해야합니다.

솔루션 : 스토리 보드에서 UILabel Lines 속성을 1로 설정하십시오. Xcode를 다시 시작하십시오. 그것은 나를 위해 일하고, 더 많은 사람들을 도울 수 있기를 바랍니다.

단어를 한 줄 이상 표시해야하는 경우. 코드에서해야합니다.

//the words will show in UILabel
NSString *testString = @"Today I wanna set the line to multiple lines. bla bla ......  Today I wanna set the line to multiple lines. bla bla ......"
[self.UserNameLabel setNumberOfLines:0];
self.UserNameLabel.lineBreakMode = NSLineBreakByWordWrapping;
UIFont *font = [UIFont systemFontOfSize:12];
//Here I set the Label max width to 200, height to 60
CGSize size = CGSizeMake(200, 60);
CGRect labelRect = [testString boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:[NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName] context:nil];
self.UserNameLabel.frame = CGRectMake(self.UserNameLabel.frame.origin.x, self.UserNameLabel.frame.origin.y, labelRect.size.width, labelRect.size.height);
self.UserNameLabel.text = testString;


답변

요약하자면 위의 두 가지 지침에 따라 numberOfLines = 0 이상인 인스턴스를 변경하고 스토리 보드 소스 내부의 각 레이블 인스턴스에 preferredMaxLayoutWidth = “0”을 수동으로 추가하면 모든 경고가 해결되었습니다.


답변

50 명성이 없기 때문에 Stackoverflow는 두 번째로 가장 좋은 답변에 대해 언급하지 않습니다. 스토리 보드에서 범인 레이블을 찾는 또 다른 요령을 찾았습니다.

레이블의 ID를 알고 나면 뷰 컨트롤러가 표시된 별도의 탭에서 스토리 보드를 열고 F 명령과 V 명령을 수행하면 해당 레이블로 바로 이동합니다.)