Xcode 9의 안전 영역


150

인터페이스 빌더 에서 Xcode9 베타 발견 안전 영역 을 탐색하는 동안 계층 뷰어를보십시오. 애플 문서에서 안전 영역에 대해 궁금해하고, 문서에서 "자동 레이아웃과 직접 상호 작용하는 뷰 영역" 에 대해 알고 자했지만 만족하지는 못했습니다.이 새로운 것을 실제로 사용하고 싶습니다.

어떤 단서가 있습니까?

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

안전 영역에 대한 Apple Doc의 결론 단락.

UILayoutGuide 클래스는 이전에 더미보기에서 수행 한 모든 작업을 수행하도록 설계되었지만보다 안전하고 효율적인 방식으로 수행합니다. 레이아웃 안내선은 새 뷰를 정의하지 않습니다. 뷰 계층 구조에 참여하지 않습니다. 대신, 그들은 자동 레이아웃과 상호 작용할 수있는 소유 뷰의 좌표 시스템에서 직사각형 영역을 정의합니다.


1
WWDC 세션을 볼 수 있습니다. 거기에 모든 것이 설명되어 있습니다. 이름이 확실하지 않습니다. 이름에 Xcode 또는 InterfaceBuilder가있는 것.
Maik639

답변:


282

안전 영역은 레이아웃 가이드입니다 ( 안전 영역 레이아웃 가이드 ) .
막대 및 기타 내용에 의해 가려지지 않은 뷰 부분을 나타내는 레이아웃 안내. iOS 11 이상에서 Apple은 상단 및 하단 레이아웃 가이드를 더 이상 사용하지 않고 단일 안전 영역 레이아웃 가이드로 대체합니다.

화면에보기가 표시되면이 안내서는 다른 내용으로 다루지 않은보기 부분을 반영합니다. 보기의 안전한 영역은 탐색 막대, 탭 막대, 도구 모음 및보기 컨트롤러의보기를 가리는 기타 조상으로 덮여있는 영역을 반영합니다. tvOS에서 안전 영역 overscanCompensationInsets은 UIScreen 의 속성에 정의 된대로 화면의 베젤을 통합합니다 . 또한 뷰 컨트롤러의 additionalSafeAreaInsets속성에 의해 정의 된 추가 공간도 포함합니다 . 보기가 현재보기 계층 구조에 설치되어 있지 않거나 아직 화면에 표시되지 않으면 레이아웃 안내선이 항상보기의 가장자리와 일치합니다.

뷰 컨트롤러의 루트 뷰의 경우이 속성의 안전 영역은 숨겨져있는 뷰 컨트롤러 내용의 전체 부분과 지정한 추가 삽입을 나타냅니다. 뷰 계층 구조의 다른 뷰의 경우 안전 영역에는 해당 뷰에서 가려진 부분 만 반영됩니다. 예를 들어, 뷰가 뷰 컨트롤러 루트 뷰의 안전 영역 내에 완전히있는 경우이 속성의 가장자리 삽입은 0입니다.

Apple에 따르면 Xcode 9-릴리스 노트
Interface Builder는 UIViewController에서 사용되지 않는 상단 및 하단 레이아웃 가이드를 대신하여 UIView.safeAreaLayoutGuide를 사용합니다. 새 안전 영역을 사용하려면 파일 관리자에서 뷰 컨트롤러의 안전 영역 레이아웃 안내선을 선택한 다음 내용과 새 안전 영역 앵커 사이에 제약 조건을 추가하십시오. 그러면 상단 및 하단 막대와 tvOS의 오버 스캔 영역으로 인해 콘텐츠가 가려지지 않습니다. 이전 버전의 iOS에 배포 할 때 안전 영역에 대한 제약 조건이 상단 및 하단으로 변환됩니다.

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


다음은 기존 (상단 및 하단) 레이아웃 가이드와 안전 영역 레이아웃 가이드를 비교하여 유사한 시각적 효과를 만들기위한 간단한 참조입니다.

안전 구역 레이아웃 : 여기에 이미지 설명을 입력하십시오

자동 레이아웃

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


안전 영역 레이아웃으로 작업하는 방법?

해결책을 찾으려면 다음 단계를 따르십시오.

  • 활성화되지 않은 경우 '안전 영역 레이아웃'을 활성화하십시오.
  • Super view 와의 연결이 표시되면 '모든 구속 조건'을 제거 하고 안전한 레이아웃 앵커로 모두 다시 부착하십시오. 또는 구속 조건을 두 번 클릭하고 수퍼 뷰에서 SafeArea 앵커로 연결을 편집합니다.

다음은 샘플 영역, 안전한 영역 레이아웃 및 편집 제약 조건을 활성화하는 방법입니다.

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

위의 변경 결과는 다음과 같습니다

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


SafeArea를 사용한 레이아웃 디자인
iPhone X를 디자인 할 때 레이아웃이 화면을 채우고 장치의 둥근 모서리, 센서 하우징 또는 홈 화면에 액세스하기위한 표시기에 의해 가려지지 않도록해야합니다.

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

탐색 모음, 테이블 및 컬렉션과 같은 시스템에서 제공하는 표준 UI 요소를 사용하는 대부분의 앱은 장치의 새로운 폼 팩터에 자동으로 적응합니다. 배경 자료가 디스플레이 가장자리까지 확장되고 UI 요소가 적절하게 삽입되고 배치됩니다.

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

사용자 정의 레이아웃이있는 응용 프로그램의 경우, 특히 응용 프로그램에서 자동 레이아웃을 사용하고 안전 영역 및 여백 레이아웃 가이드를 준수하는 경우 iPhone X 지원이 비교적 쉬워야합니다.

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


다음은 샘플 코드입니다 (참조 : 안전 영역 레이아웃 안내서 ) :
코드에서 구속 조건을 작성하는 경우 UIView의 safeAreaLayoutGuide 특성을 사용하여 관련 레이아웃 앵커를 가져 오십시오. 코드에서 위의 인터페이스 빌더 예제를 다시 작성하여 모양을 확인하십시오.

뷰 컨트롤러에 녹색 뷰가 속성으로 있다고 가정합니다.

private let greenView = UIView()

viewDidLoad에서 호출 된 뷰와 제약 조건을 설정하는 함수가있을 수 있습니다.

private func setupView() {
  greenView.translatesAutoresizingMaskIntoConstraints = false
  greenView.backgroundColor = .green
  view.addSubview(greenView)
}

항상 루트 뷰의 layoutMarginsGuide를 사용하여 선행 및 후행 여백 제한 조건을 작성하십시오.

 let margins = view.layoutMarginsGuide
    NSLayoutConstraint.activate([
      greenView.leadingAnchor.constraint(equalTo: margins.leadingAnchor),
      greenView.trailingAnchor.constraint(equalTo: margins.trailingAnchor)
 ])

이제 iOS 11 만 타겟팅하지 않는 한 안전 영역 레이아웃 가이드 제약 조건을 #available로 감싸고 이전 iOS 버전의 경우 상단 및 하단 레이아웃 가이드로 넘어 가야합니다.

if #available(iOS 11, *) {
  let guide = view.safeAreaLayoutGuide
  NSLayoutConstraint.activate([
   greenView.topAnchor.constraintEqualToSystemSpacingBelow(guide.topAnchor, multiplier: 1.0),
   guide.bottomAnchor.constraintEqualToSystemSpacingBelow(greenView.bottomAnchor, multiplier: 1.0)
   ])

} else {
   let standardSpacing: CGFloat = 8.0
   NSLayoutConstraint.activate([
   greenView.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor, constant: standardSpacing),
   bottomLayoutGuide.topAnchor.constraint(equalTo: greenView.bottomAnchor, constant: standardSpacing)
   ])
}


결과:

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


UIView확장 후에는 프로그래밍 방식으로 SafeAreaLayout을 쉽게 사용할 수 있습니다.

extension UIView {

  // Top Anchor
  var safeAreaTopAnchor: NSLayoutYAxisAnchor {
    if #available(iOS 11.0, *) {
      return self.safeAreaLayoutGuide.topAnchor
    } else {
      return self.topAnchor
    }
  }

  // Bottom Anchor
  var safeAreaBottomAnchor: NSLayoutYAxisAnchor {
    if #available(iOS 11.0, *) {
      return self.safeAreaLayoutGuide.bottomAnchor
    } else {
      return self.bottomAnchor
    }
  }

  // Left Anchor
  var safeAreaLeftAnchor: NSLayoutXAxisAnchor {
    if #available(iOS 11.0, *) {
      return self.safeAreaLayoutGuide.leftAnchor
    } else {
      return self.leftAnchor
    }
  }

  // Right Anchor
  var safeAreaRightAnchor: NSLayoutXAxisAnchor {
    if #available(iOS 11.0, *) {
      return self.safeAreaLayoutGuide.rightAnchor
    } else {
      return self.rightAnchor
    }
  }

}

Objective-C의 샘플 코드는 다음과 같습니다 .


다음은 안전 영역 레이아웃 안내서를 위한 Apple 개발자 공식 문서입니다.


iPhone-X의 사용자 인터페이스 디자인을 처리하려면 안전 영역이 필요합니다. 안전 영역 레이아웃을 사용하여 iPhone-X 용 사용자 인터페이스를 디자인하는 방법에 대한 기본 지침은 다음과 같습니다.


marginsview.leadingAnchor사용시 let margins = view.layoutMarginsGuide및 나중에 사용시 의 차이점 margins.leadingAnchor은 뷰의 여백 으로 뷰를 제한하는 것 입니다. 이것은 측면에 약간의 공간을 추가합니다. 당신이 원하지 않으면 그럼 그냥 사용 view.leadingAnchor하고 view.trailingAnchor당신은 ... 왼쪽에 공백을 참조하거나 잘되지 않습니다

할 일이 의미없는 "뷰의 안전 영역은 뷰 컨트롤러의 뷰 모호하게 탐색 바, 탭 바, 도구 모음 및 기타 조상에 의해 커버되는 영역 반영" 하지 덮여? 이 문서에는 " 막대 및 기타 내용이 잘 보이지 않습니다."라고 표시되어 있습니다.
Honey

Xcode 10.1에서 안전 영역이 전체 화면보기에서 화면 하단으로 확장되지 않는 이상한 동작을 보았습니다. 실수로 '탭 바'를 맨 아래로 끈 다음 삭제하여 원인이 있다고 생각합니다. 텍스트 편집기로 수동으로 삭제 한 .storyboard 파일에서이 줄을 찾았습니다. <simulatedToolbarMetrics key = "simulatedBottomBarMetrics"/>. 이것은 그것을 고쳤다.
Dave Hubbard

20

내가 언급 할 내가 둥근 모서리와 새로운 아이폰 X의 "노치"을 피하기 위해 SpriteKit 기반 응용 프로그램을 적용하려고 할 때 최신에 의해 제안, 나를 먼저 잡은 뭔가 휴먼 인터페이스 가이드 라인을 새로운 특성 : safeAreaLayoutGuideUIView요구에 의미있는 레이아웃 프레임을보고하기 위해 보기가 계층 구조에 추가 된 (예 : on -viewDidAppear:) 쿼리 됩니다 (그렇지 않으면 전체 화면 크기 만 반환 함).

속성 문서에서 :

막대 및 기타 내용에 의해 가려지지 않은 뷰 부분을 나타내는 레이아웃 안내. 화면에보기가 표시 되면이 안내서는 탐색 막대, 탭 막대, 도구 모음 및 기타 상위보기로 다루지 않은보기 부분을 반영합니다. tvOS에서 안전 영역은 화면의 베젤을 덮지 않은 영역을 반영합니다. 보기가 현재보기 계층 구조에 설치되어 있지 않거나 화면에 아직 표시되지 않은 경우 레이아웃 안내선 모서리는보기의 모서리와 같습니다 .

(강조 광산)

당신이 일찍로 읽을 경우 -viewDidLoad:layoutFrame가이드의는 것 {{0, 0}, {375, 812}}대신 예상의{{0, 44}, {375, 734}}


여기도 마찬가지입니다. 나는 항상 문서를 완전히 읽지 않고 이름으로 만 안내되는 유형의 사용 가능한 속성을 뛰어 넘습니다.
Nicolas Miari

18

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

  • 아이폰 OS 7.0-11.0 <에 이전 되지 않음 > UIKit용도 topLayoutGuide & bottomLayoutGuideUIView특성
  • iOS11 +는 safeAreaLayoutGuide 를 사용 UIView합니다.

  • 파일 관리자에서 Safe Area Layout Guide 확인란을 활성화 합니다.

  • 안전 영역은 전체 인터페이스의 보이는 부분 내에 뷰를 배치하는 데 도움이됩니다.

  • 에서는 tvOS , 안전 영역은 화면의 베젤에 의해 커버되는 영역을 나타내는 화면의 오버 스캔 세트를 포함한다.

  • safeAreaLayoutGuide는 탐색 막대, 탭 막대, 도구 모음 및 기타 상위보기로 다루지 않는보기 부분을 반영합니다.
  • 안전한 장소를 사용하여 콘텐츠 UIButton 등 을 배치하십시오 .

  • iPhone X를 설계 할 때는 레이아웃이 화면을 채우고 장치의 둥근 모서리, 센서 하우징 또는 홈 화면에 액세스하기위한 표시기에 의해 가려지지 않아야합니다.

  • 배경이 디스플레이의 가장자리까지 확장되고 테이블 및 컬렉션과 같이 세로로 스크롤 가능한 레이아웃이 맨 아래까지 계속 표시되도록합니다.

  • 상태 표시 줄은 다른 iPhone보다 iPhone X에서 더 큽니다. 앱이 상태 표시 줄 아래에 컨텐츠를 배치하기 위해 고정 된 상태 표시 줄 높이를 가정하는 경우 사용자의 장치를 기반으로 컨텐츠를 동적으로 배치하도록 앱을 업데이트해야합니다. 음성 녹음 및 위치 추적과 같은 백그라운드 작업이 활성화되어있는 경우 iPhone X의 상태 표시 줄은 높이가 변경되지 않습니다. print(UIApplication.shared.statusBarFrame.height)//44 for iPhone X, 20 for other iPhones

  • 홈 인디케이터 컨테이너의 높이는 34 포인트입니다.

  • 안전 영역 레이아웃 안내서 를 활성화 하면 인터페이스 영역에 안전 영역 제약 조건이 나열됩니다.

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

당신은 각각에 제약 조건을 설정할 수 있습니다 self.view.safeAreaLayoutGuide시스 -

ObjC :

  self.demoView.translatesAutoresizingMaskIntoConstraints = NO;
    UILayoutGuide * guide = self.view.safeAreaLayoutGuide;
    [self.demoView.leadingAnchor constraintEqualToAnchor:guide.leadingAnchor].active = YES;
    [self.demoView.trailingAnchor constraintEqualToAnchor:guide.trailingAnchor].active = YES;
    [self.demoView.topAnchor constraintEqualToAnchor:guide.topAnchor].active = YES;
    [self.demoView.bottomAnchor constraintEqualToAnchor:guide.bottomAnchor].active = YES;

빠른:

   demoView.translatesAutoresizingMaskIntoConstraints = false
        if #available(iOS 11.0, *) {
            let guide = self.view.safeAreaLayoutGuide
            demoView.trailingAnchor.constraint(equalTo: guide.trailingAnchor).isActive = true
            demoView.leadingAnchor.constraint(equalTo: guide.leadingAnchor).isActive = true
            demoView.bottomAnchor.constraint(equalTo: guide.bottomAnchor).isActive = true
            demoView.topAnchor.constraint(equalTo: guide.topAnchor).isActive = true
        } else {
            NSLayoutConstraint(item: demoView, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1.0, constant: 0).isActive = true
            NSLayoutConstraint(item: demoView, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailing, multiplier: 1.0, constant: 0).isActive = true
            NSLayoutConstraint(item: demoView, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1.0, constant: 0).isActive = true
            NSLayoutConstraint(item: demoView, attribute: .top, relatedBy: .equal, toItem: view, attribute: .top, multiplier: 1.0, constant: 0).isActive = true
        }

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

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

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


이 글 머리 기호 안내서가 매우 유용하지만 "안전 영역이 탐색 표시 줄, 탭 표시 줄, 도구 모음 및 기타 조상보기를 다루지 않습니다"란 정확히 무엇을 의미합니까?
Chewie The Chorkie

1
예-위 마지막 화면과 같이 safreAreaGuide
Jack

8

Apple은 iOS 7에서 UIViewController의 속성으로 topLayoutGuide 및 bottomLayoutGuide를 도입했습니다. 상태, 탐색 또는 탭 막대와 같은 UIKit 막대에 의해 콘텐츠가 숨겨지지 않도록 제약 조건을 만들 수 있습니다. 이 레이아웃 가이드는 iOS 11에서 더 이상 사용되지 않으며 단일 안전 영역 레이아웃 가이드로 대체됩니다.

자세한 내용은 링크 를 참조하십시오.


5

안전 영역 레이아웃 안내서는 내용과 컨트롤을 배치 할 때 시스템 UI 요소가 겹치지 않도록합니다.

안전 영역은 상태 표시 줄, 탐색 표시 줄 및 도구 모음 또는 탭 표시 줄인 시스템 UI 요소 사이의 영역입니다. 따라서 앱에 상태 표시 줄을 추가하면 안전 영역이 줄어 듭니다. 앱에 탐색 표시 줄을 추가하면 안전 영역이 다시 축소됩니다.

iPhone X에서 안전 영역은 막대가 표시되지 않은 경우에도 위쪽 및 아래쪽 화면 가장자리에서 세로로 추가 삽입 된 부분을 제공합니다. 가로 방향의 안전 영역은 화면 측면과 홈 표시기에서 시작됩니다.

Apple의 iPhone X 용 비디오 디자인 에서 가져 왔으며 다양한 요소가 안전 영역에 미치는 영향을 시각화합니다.

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