sourcecode

iOS 8.0 이전 버전에서는 자동 우선 레이아웃 폭을 사용할 수 없습니다.

codebag 2023. 4. 13. 20:48
반응형

iOS 8.0 이전 버전에서는 자동 우선 레이아웃 폭을 사용할 수 없습니다.

Xcode6 베타6으로 기존 iOS 프로젝트를 열었는데, Xcode에는 Storyboard와 Xib 파일 모두에 대해 다음과 같은 경고가 표시됩니다.

iOS 8.0 이전 버전에서는 자동 우선 레이아웃 폭을 사용할 수 없습니다.

다음과 같이 너비를 명시적으로 설정하여 경고에 대처하려고 했습니다.

그러나 이 경고는 해결되지 않았다.어떻게 제거할 수 있습니까?

3 ★★★★★★ 3:
는 또한 이 '알다'로 되어 있는 할 수 .numberOfLines전개 대상이 7.1로 설정되어 있는 경우는, 1 이외의 임의의 값으로 설정됩니다.이것은 새로운 싱글 뷰 프로젝트로 완전히 재현할 수 있습니다.

재현 순서:

  1. 새로운 단일 뷰의 목표 C 프로젝트 생성
  2. 배포 대상을 7.1로 설정
  3. 프로젝트의 스토리보드를 엽니다.
  4. 제공된 뷰 컨트롤러에 레이블을 놓습니다.
  5. 해당 라벨의 numberOfLines를 2로 설정합니다.
  6. 컴파일

하다
://1800567

2 ★★★★★★★★★
안타깝게도 Xcode 6 릴리즈 버전에서도 이 문제가 발생합니다.대부분의 경우 스토리보드/xib를 수동으로 편집하여 문제를 해결할 수 있습니다.Charles A.의하면, 이하의 코멘트에 기재되어 있습니다.

이 경고는 우발적으로 쉽게 도입될 수 있으며 경고 자체는 범인의 라벨을 찾는 데 도움이 되지 않습니다.이것은 복잡한 스토리보드에서는 유감스러운 일입니다.스토리보드를 소스 파일로 열고 regex를 사용하여 검색하여 원하는 MaxLayoutWidth 속성/값을 생략한 레이블을 찾을 수 있습니다.이러한 행에 preferredMaxLayoutWidth="0"을 추가하면 명시적으로 표시하고 값을 0으로 설정하는 것과 같습니다.

1 ★★★★★★1 :
6되었습니다.

답변 ★★★
Xcode6-Beta6 x XCode6-Beta7 、 XCode6-Beta7 、 XCode6-Beta7 。

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

기본 최대 레이아웃 폭은 UILabel의 자동 레이아웃 속성으로, 컨텐츠에 맞게 자동으로 수직으로 확장할 수 있습니다.6.0 이전 버전의 Xcode에서는 설계 시 멀티라인 라벨의 preferred MaxLayoutWidth를 현재 경계 크기로 설정합니다.수평 레이아웃이 변경된 경우 실행 시 preferred MaxLayoutWidth를 수동으로 업데이트해야 합니다.

iOS 8은 실행 시 preferred MaxLayoutWidth를 자동으로 계산하도록 지원하므로 여러 줄의 라벨을 쉽게 만들 수 있습니다.이 설정은 iOS 7과 하위 호환성이 없습니다.iOS 7과 iOS 8을 모두 지원하기 위해 Xcode 6을 사용하면 크기 검사기의 우선 MaxLayoutWidth에 대해 "자동" 또는 "명시"를 선택할 수 있습니다.다음 작업을 수행해야 합니다.

최상의 경험을 위해 iOS 8을 대상으로 하는 경우 "자동"을 선택하십시오.< iOS 8을 대상으로 하고 있는 경우는, 「Explicit(명시)」를 선택합니다.그 후, 설정하는 preferred Max Layout Width 의 값을 입력할 수 있습니다."Explicit(명시적)"을 활성화하면 확인란을 선택한 시점에 현재 경계 크기가 기본값으로 설정됩니다.

경고는 (1) 자동 레이아웃을 사용하고 (2) 여러 줄의 라벨에 대해 "자동"이 설정되어 있는 경우 [라벨의 크기 검사기에서 확인할 수 있습니다], (3) 배포 대상 < iOS 8이 설정되어 있는 경우 표시됩니다.

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

하여 " 8 Later"를 iOS 8.0 and Later"로 변경하여 할 수 .Xcode 파일 검사기

큰 스토리보드에서 문제의 라벨을 찾으려면 다음 절차를 따릅니다.

  1. xCode의 Issue Navigator에서 오류를 마우스 오른쪽 버튼으로 클릭하고 "Reveal In Log"를 선택합니다.(주의: @Sam은 아래에 xCode의 보고서 내비게이터를 참조하십시오.또한 @Rivera는 댓글에 "Xcode 6.1.1에서 경고를 클릭하면 자동으로 열리고 충돌하는 라벨이 강조 표시됩니다."라고 적습니다.아직 테스트하지 않았습니다).

여기에 이미지 설명 입력

  1. 그러면 스토리보드 파일 끝에 오류가 표시되고 코드가 표시됩니다..storyboard 뒤에 값을 복사합니다.

여기에 이미지 설명 입력

  1. 다음으로 스토리보드를 소스 파일로 표시합니다. 여기에 이미지 설명 입력

  2. 검색해보세요. 어떤 라벨인지 내용을 보면 쉽게 알 수 있을 거예요. 여기에 이미지 설명 입력

라벨을 발견하면, 「우선폭」을 「0」으로 설정하는 것이 효과가 있었습니다.

여기에 이미지 설명 입력

그나저나, 당신은 항상 항목을 선택하고 식별 검사기 아래를 보면 인터페이스 항목의 ID를 빠르게 얻을 수 있습니다.매우 편리합니다.

여기에 이미지 설명 입력

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

검색 방법

  1. 문제 탐색기(CMD+8)로 이동하여 경고와 함께 최신 빌드 선택여기에 이미지 설명 입력
  2. 경고('자동 우선 최대 레이아웃' 검색)를 찾아 오른쪽에 있는 확장 버튼을 누릅니다.
    여기에 이미지 설명 입력
  3. UILabel 개체 ID 검색여기에 이미지 설명 입력
  4. Storyboard를 열고 오브젝트의 SEARCH(CMD+f)를 엽니다.UILABEL을 선택하고 강조 표시합니다.
  5. 다른 제안과 같이 기본 너비 = 0 "명시적" 설정

솔루션은 매우 심플합니다.

iOS 8 이상용 빌드만 활성화

여기에 이미지 설명 입력

현재 Xcode 버전은 6.1입니다.하지만 경고도 받았어요.그것은 나를 매우 짜증나게 한다. 몇 번이고 계속 검색한 후에.해결책을 찾았어요

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

해결책: Storyboard에서 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는 두 번째 최선의 답변에 대해 코멘트를 하지 않을 것이다.Storyboard에서 범인 라벨을 찾기 위한 다른 방법을 찾았습니다.

라벨의 ID를 알게 되면 뷰 컨트롤러가 표시된 별도의 탭에서 스토리보드를 열고 명령어 F와 명령어 V를 실행하면 해당 라벨로 바로 이동합니다.

W/H 셀렉션에서 가지고 있던 원래의 레이아웃을 선택하여 작업을 했습니다.스토리보드는 정상적으로 동작하고 있어 에러는 해소.

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

여기가 눌러야 하는 곳이에요.

이 문제가 발생하여 라벨의 최대값을 결정하기 위한 구속조건을 추가하여 수정할 수 있었습니다.

에서 여러 줄 레이블을 놓을 때 상위 보기 내에서 너비를 적용하도록 구속조건이 설정되지 않습니다.여기서 새로운 Preferred Max Width가 적용됩니다.iOS 7 이전 버전에서는 사용자가 직접 최대 폭을 정의해야 합니다.라벨의 왼쪽과 오른쪽에 10px 구속을 추가했을 뿐입니다.

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

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

위의 솔루션에서는 부모 뷰의 크기에 관계없이 폭은 항상 유지됩니다.

어떤 이유로 iOS Deployment Target을 8.0 이상으로 변경하더라도 Xib 파일은 변경 사항을 적용하지 않고 File Inspector(파일 검사기)의 이전 설정으로 유지됩니다.

iOS Deployment 타겟 변경 후 Xib 파일인스펙터

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

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

언급URL : https://stackoverflow.com/questions/25398312/automatic-preferred-max-layout-width-is-not-available-on-ios-versions-prior-to-8

반응형