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


322

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

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

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

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


3
XCode 6.1을 사용하고 있으며 모든 레이블을 기본 너비 = 명시 적으로 업데이트했습니다. 이것은 나를 위해 문제를 해결했습니다.
djburdick

답변:


373

업데이트 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 파일 관리자


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

6
preferredMaxLayoutWidth를 실제로 서브 클래 싱하거나 layoutSubviews의 어딘가에서 구현하지 않고 자동으로 조정하도록 UILabel을 프로그래밍 방식으로 구성 할 수있는 방법이 있습니까? 이것이 IB가 활성화 할 수있는 동작이면 설정할 수있는 속성 또는 마법 값이 있음을 나타냅니다. 그러나 API 문서 또는 헤더에는 아무것도 말하지 않습니다.
algal

2
@CharlesA. 빈 프로젝트로 테스트 한 결과이 경고를 발생시키는 다른 레이블 속성을 발견했습니다 numberOfLines.1 이외의 값으로 설정 하면 설정 여부에 관계없이 경고가 발생 preferredMaxLayoutWidth합니다.
memmons

2
@ MichaelG.Emmons Strange, 깨끗한 프로젝트와 배포 대상을 7.1로 설정 한 상태에서는 재현 할 수 없습니다. 를 preferredMaxLayoutWidth명시 적 0으로 설정 하면 numberOfLines값에 관계없이 경고가 사라 집니다. 그러나 오늘 아침 Xcode 업데이트에서 수정되었을 것입니까?
Charles A.

2
그렇다면 ... 행 수를 1로 설정하고 코드에서 변경하는 유일한 솔루션입니까? 이것은 전문적으로 보이지 않습니다
jomafer

315

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

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

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

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

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

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

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

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

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

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

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


36
이것이 정답입니다! 이것은 실제로 문제를 해결합니다. 스토리 보드에서 정상적으로 표시되지 않는 다른 문제를 찾는 데 도움이됩니다. 한 가지 : 나는 것을 발견 보고서 네비게이터 은 "로그인 계시"를 마우스 오른쪽 버튼으로 클릭보다 훨씬 더 신뢰할
샘 스펜서

1
이 답변을 매우 간단하게 사랑하고 경고를 수정했습니다. 정말 고마워!
Ethan Parker

1
감사합니다 so so much muchhhhh :)
SR Nayak

2
인터페이스 빌더에 표시된 너비가 아닌 기본 너비를 0으로 설정하는 이유는 무엇입니까?
Biclops

9
멋진 답변! 스토리 보드의 IB보기에서 직접 오브젝트 ID를 검색 할 수 있습니다. Ctrl-f를 수행하십시오. 소스 코드로 열 필요가 없으며 선호하는 너비를 변경하기 위해 IB보기로 다시 전환해야합니다.
AndroidDev

36

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

그것을 찾는 방법?

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

23

해결책은 매우 간단합니다

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

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


아주 간단하고 파괴적입니다. iOS 사용자의 85 %만이 iOS8 + developer.apple.com/support/app-store에 있습니다
aryaxt

6
@aryaxt 당신이 틀렸다고 유감입니다. 프로젝트 설정에서 배치 대상을 iOS 7 이하로 설정하고 IB 문서에서 빌드를 iOS 8 이상으로 변경하면 iOS 7에서 작동합니다.이를 확인하고 다운 보트를 제거하십시오. 당신은 여기에서 확인하실 수 있습니다 developer.apple.com/library/ios/recipes/...
알레한드로 Luengo

1
언제나 가장 좋은 대답은 받아 들여지지 않는 것입니다 ... :) 건배!
HepaKKes

iOS9.3 이상 업데이트 : iOS7 디바이스는 더 이상 위 설정으로 스토리 보드를 렌더링하지 않습니다. 이것은 9.3 업데이트 이전에 작동했습니다. Apple이 시험판 자동화 프로세스에서 무언가를 변경 한 것처럼 보입니다.
pechar

4

이제 내 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;

3
"실제로 한 줄 이상으로 단어를 표시해야하는 경우 코드에서 수행해야합니다." 이건 트롤이지?
webstersx

@webstersx 나는 그가 진지하다고 생각
Jasper

4

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


친구 u는 마법사입니다! 예상대로 UIScrollerView와 함께 작동합니다. iOS 7.0에서 Nib의 배포 대상을 남길 수 있기 때문에 지금까지 최고의 솔루션
Yaro

3

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

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


프로젝트에서 레이블 ID를 검색하는 것을 의미합니다.
Borzh

2

W / H 선택에서 가지고 있던 원래 레이아웃을 선택하여 작동하게했습니다. 스토리 보드가 예상대로 작동하고 오류가 사라졌습니다.

iOS 8.0 용으로 개발중인지도 확인하십시오. 프로젝트의 일반 설정에서 확인하십시오.

이 곳을 눌러야합니다.


1

나는이 문제가 있었고 레이블의 최대 값을 결정하기 위해 제약 조건을 추가하여 문제를 해결할 수있었습니다.

여러 줄 레이블을 놓을 때 부모 뷰 내부에 너비를 적용하기 위해 구속 조건이 설정되지 않았습니다. 새로운 PreferredMaxWidth가 시작됩니다. iOS 7 및 이전 버전에서는 최대 너비를 직접 정의해야합니다. 레이블의 왼쪽과 오른쪽에 10px 제약 조건을 추가했습니다.

<= width 제약 조건을 추가하여 문제를 해결할 수도 있습니다.

따라서 이것은 실제로 버그가 아니며 최대 너비를 직접 정의하면됩니다. 다른 답변에서 명시 적 옵션 언급은이 너비 값을 설정할 때도 작동하지만 부모 너비를 기준으로 최대 너비를 변경하려면 너비를 명시 적으로 설정해야 하므로이 값을 수정해야합니다.

위의 솔루션은 부모보기의 크기에 관계없이 너비가 항상 유지되도록합니다.


1

어떤 이유로 iOS 배포 대상을 8.0 이상으로 변경하더라도 Xib 파일은 해당 변경 사항을 적용하지 않으며 파일 관리자의 이전 설정을 유지합니다

iOS 배포 대상을 변경 한 후 Xib의 파일 관리자

따라서 각 Xib에 대해 수동으로 변경해야합니다 수동 변경

완료되면 경고가 사라집니다 :-)

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