Programming

인터페이스 빌더 : UIView의 레이아웃 iOS 6/7 델타는 무엇입니까?

procodes 2020. 7. 28. 22:09
반응형

인터페이스 빌더 : UIView의 레이아웃 iOS 6/7 델타는 무엇입니까?


방금 UIView의 구조체 레이아웃에서 iOS 6/7 Delta 속성을 발견했습니다.

이것이 무엇이며 왜 AutoLayout에서 누락 되었습니까?

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


이것은 실제로 iOS6에서 iOS7까지의 레이아웃 위치 사이의 델타를 나타냅니다.

iOS7에서 일부보기는 상태 표시 줄을 숨기거나 투명하게 만들 수 있으며, 실제로는보기 위에 겹쳐집니다. 따라서 iOS6에서 UI 요소를 (0.0, 0.0)에 배치하면 상태 표시 줄 아래에 표시되지만 iOS7에서는 상태 표시 줄 아래에 부분적으로 표시되어 나타납니다. 따라서이 경우 iOS6 및 iOS7에서 레이아웃이 동일하게 표시되도록 상태 표시 줄 높이 (20.0 포인트)와 일치하는 델타가 필요합니다.

자동 레이아웃을 사용하면 이것이 필요하지 않다고 생각합니다. 물론 iPad1 지원을 잃어 버리기 때문에 많은 사람들 이이 시점에서 인정하지 않습니다.


참고 : 나는이 질문을 얼마 전에 보았지만 NDA가 해제 되었기 때문에 지금 답변을 게시하고 있습니다.

자동 레이아웃에 나타나지 않는 이유는 무엇입니까?

아시다시피, iOS 7은 완전히 새로운 모습을 보여줍니다. UI 요소의 모양이 변경되었지만 크기 (또는 일반적인 메트릭)도 일부 변경되었습니다. 이로 인해 iOS 7을 모두 수용 할 수있는 인터페이스 디자인이 가능하며, 이전 모델은 약간의 고통입니다.

Apple의 공식 라인은 AutoLayout을 사용하여이 문제를 해결하는 것입니다. UI 요소를 배치하는 데 많은 번거 로움이 필요합니다. 때로는 비즈니스상의 이유로 iOS 5를 계속 지원해야하거나 인터페이스가 AutoLayout 구현을 어렵게 만드는 방식으로 관리해야하는 경우에는이를 통합하기가 쉽지 않습니다. 따라서 애플은이 틈새 카테고리에 속하면 작업을 조금 더 쉽게 해줄 수있는 방법을 제공 한 것으로 보이며이를 iOS 6/7 델타라고 불렀습니다.

그럼 어떻게합니까?

이 문맥에서 '델타'의 의미에 대해 Interface Builder의 레이블이 약간 불분명하지만이 기능에 해당하는 .xib 파일에 포함 된 코드는 조금 더 명확합니다.

<inset key="insetFor6xAndEarlier" minX="-50" minY="-100" maxX="-50" maxY="300"/>

키 이름 insetFor6xAndEarlier은 이것이하는 일을 명시 적으로 나타냅니다. iOS 7의 이전 버전에서 실행될 때 UI 요소에 대한 대체 인세 트를 제공 할 수 있습니다. 예를 들어, 위는 다음과 같은 델타 변경을 정의합니다.

x: 50
y: 100
width: -100
height: 200

.xib에 저장된 값이 인용 된 값과 직접적으로 일치하지는 않지만 그 값 사이에는 상관 관계가 있습니다.

x: -minX
y: -minY
width: minX + maxX
height: minY + maxY

아래 이미지는이 변화를 시각적으로 보여줍니다. 그것은 극단적 인 예이지만, 그 능력을 보여줍니다. 실제로는 몇 픽셀의 델타 변경 만 기대합니다.

iOS7보기

iOS6보기

값이 iOS 6보기와 반대임을 알 수 있습니다. 델타는 작업중인 뷰 유형과 관련이 있기 때문입니다. iOS 6을 편집하는 경우 iOS 7의 요소를 올바르게 변환하기 위해 델타가 있습니다 (위 예의 반대).

다른 스타일을보기 위해 실행중인 OS에 따라 Interface Builder가 표시하는 방식을 변경할 수 있습니다. 이 파일은 File Inspector-> Interface Builder Document (오른쪽 막대의 첫 번째 탭)에 포함되어 있습니다.

인터페이스 스타일 스위치

인터페이스를 직접 코딩하려는 경우에도 존재합니까?

직접적으로는 아니지만 코드 내에서 OS 버전을 조건부로 확인하고 그에 따라 올바른 위치 / 크기를 설정하여 동일한 효과를 쉽게 얻을 수 있습니다. 델타 기능은 인터페이스 빌더에 존재합니다. 코드를 작성하지 않고 조건부 포지셔닝을 수행 할 수있는 간단한 방법이 없기 때문에 인터페이스 빌더의 요점은 UI에 가능한 많은 방법으로 코드를 가져 오는 것입니다.

사무용 겉옷...

Apple은 AutoLayout을 사용하는 것이 좋습니다. 대부분의 경우 인생을 더 편하게 만듭니다. 위에서 언급 한 이유로 사용할 수없는 경우 델타는 코드에서 수동으로 위치를 조정할 필요없이 현재 OS의 메트릭을 기반으로 UI 요소를 적절하게 배치 할 수있는 유연성을 제공합니다. 좋은 예는 상태 표시 줄이 부족한 것을 조정하는 것이지만 다른 많은 사용 사례가 있습니다.

당연히 iOS7 이상에서만 개발하는 경우이 기능을 알 필요가 없으며 발견하지 않아도됩니다. 자동 레이아웃없이 iOS7 SDK로 빌드 할 때 응용 프로그램을 실행하는 iOS6 장치가 필요한 경우에만 델타가 필요합니다.

글을 쓰는 시점 (8 월 21 일)에는이 기능에 관한 문서 나 WWDC 자료에 대한 언급이 없습니다. 나는 주변에서 놀았으며 약간의 연구 후에 그것이 내가 발견 한 것입니다.


나는 이것이 이미 답변되었다는 것을 알고 있습니다. 자동 레이아웃을 사용하지 않고 여전히 iOS 6.1 및 이전 버전을 지원하려는 사람들에게 도움이되기를 바랍니다.

Apple의 전환 안내서 읽기 -이전 버전 지원

'iOS 7.0 이상'으로 '다른 이름으로보기'를 선택하십시오.

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

iOS 7의 기본 UI. iOS 6의 경우 적절한 델타 값을 제공하십시오. iOS 7 및 iOS 6 기기에서 어떻게 렌더링되는지 확인하려면 미리보기를 사용하십시오.

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

빠른 단계 :

루트 뷰의 각 직계 자식을 개별적으로 선택하고 'Y'값에 20px를 추가하십시오.

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

그런 다음 모든 직계 자식을 일괄 적으로 선택하고 델타 Y를 -20px로 지정하십시오. 일괄 또는 개별적으로이 작업을 수행 할 수도 있습니다.

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


자동 레이아웃에는 iOS 6.0 이상이 필요합니다. iOS 5.0을 지원하려는 경우 자동 레이아웃을 사용할 수 없습니다.

이 델타는 다른 iOS 버전 (주로 iOS 7 및 iOS 7보다 낮은 버전)에서보기 위치를 조정하는 데 사용됩니다.

나는이 가치를 사용하여이 그림을 좋아하게됩니다. 여기에 이미지 설명을 입력하십시오


iOS 6/7 델타가 실제로 작동하는지 확인하기 위해 iOS 6 및 iOS 7 장치 모두에 올바르게 표시되는 SegmentedControl로 데모합니다.

먼저 스토리 보드에서 .Xib 또는 ViewController를 선택하십시오. 선택을 취소 를 사용하여 자동 레이아웃 및 "선택 7 이상 아이폰 OS로보기 "

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

In the Interface Builder canvas, place your SegmentedControl so that its origin.y is 20. In iOS 6/7 Delta, choose -20 for DeltaY

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

This will make your the SegmentedControl laid below the Status Bar in both iOS 6 and iOS 7 devices

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

Another useful quotes from Developer’s Guide to the iOS 7 Status Bar

Deltas can be set individually for each view and work as you would expect. If your storyboard or nib is set to view as iOS 6, then setting the deltas will cause that view to be shifted and/or resized by the set delta amount when run in iOS 7. Alternately, if your storyboard or nib is set to view in iOS 7, then the deltas will be applied when run in iOS 6


If you are using AutoLayout, then Delta is not available. Try this (tested in iPhone 4s running iOS6):

- (void) viewWillLayoutSubviews {

//iOS 6 workaround offset
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 7) {

    self.view.clipsToBounds = YES;
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGFloat screenHeight = 0.0;
    screenHeight = screenRect.size.width;
    CGRect screenFrame = CGRectMake(0, -20, self.view.frame.size.width,self.view.frame.size.height+10);

    self.view.frame = screenFrame;
}
}

참고 : https://stackoverflow.com/questions/17794037/interface-builder-what-are-the-uiviews-layout-ios-6-7-deltas-for

반응형