iOS7에서 automaticAdjustsScrollViewInsets, extendedLayoutIncludesOpaqueBars, edgesForExtendedLayout의 차이점 설명


250

iOS7 UI 전환에 대해 많이 읽었습니다.

내가 뭘 이러한 세 가지 속성을 얻을 수 아니에요 automaticallyAdjustsScrollViewInsets, extendedLayoutIncludesOpaqueBars, edgesForExtendedLayout??

예를 들어 뷰 컨트롤러를 상태 표시 줄 아래에서 시작하려고하지만 달성 할 수 없습니다.


5
그리고 왜 당신은 내가 그것을 읽지 못했다고 생각하겠습니까? .. 문제는 내가 그것을 잘 이해하지 못했던 것처럼 예상대로 작동하지 않는다는 것입니다. .. 그 이유
user1010819

1
네가 무슨 말을했는지 오해 했어 나는 후원하는 소리를 내지 않으려 고 노력했지만, 일부 사람들이 이와 같은 질문을하고 사이트를 처음 접했을 때 분명한 해결책을 놓친 것입니다.
erdekhayser

8
viewDidLoad 메소드에서 if ([self respondsToSelector : @selector (edgesForExtendedLayout)]) self.edgesForExtendedLayout = UIRectEdgeNone; 상태 표시 줄 아래에서보기가 시작됩니다.
Nandha

답변:


629

iOS7부터 뷰 컨트롤러는 기본적으로 전체 화면 레이아웃을 사용합니다. 동시에 뷰를 배치하는 방법을 더 잘 제어 할 수 있으며 이러한 속성을 사용하여 수행됩니다.

edgeForExtendedLayout

기본적으로이 속성을 사용하면 전체 화면을 덮도록보기의 측면을 확장 할 수 있습니다. 당신이 밀어 상상해 UIViewControllerUINavigationController. 해당 뷰 컨트롤러의 뷰가 배치되면 내비게이션 바가 끝나는 위치에서 시작되지만이 속성은 뷰의 어느 쪽 (위쪽, 왼쪽, 아래쪽, 오른쪽)을 확장하여 전체 화면을 채울 수 있는지를 설정합니다.

예를 들어 보자.

UIViewController *viewController = [[UIViewController alloc] init];
viewController.view.backgroundColor = [UIColor redColor];
UINavigationController *mainNavigationController = [[UINavigationController alloc] initWithRootViewController:viewController];

여기서 값을 설정하지 edgesForExtendedLayout않으므로 기본값이 사용 UIRectEdgeAll되므로 ( )보기가 전체 화면을 채우도록 레이아웃을 확장합니다.

결과는 다음과 같습니다.

확장 된 레이아웃을 위해 가장자리가 없으면보기가 전체 화면을 채우

보시다시피 빨간색 배경은 탐색 표시 줄과 상태 표시 줄 뒤로 확장됩니다.

이제이 값을로 설정 UIRectEdgeNone하여 뷰 컨트롤러가 화면을 덮도록 뷰를 확장하지 않도록 지시합니다.

UIViewController *viewController = [[UIViewController alloc] init];
viewController.view.backgroundColor = [UIColor redColor];
viewController.edgesForExtendedLayout = UIRectEdgeNone;
UINavigationController *mainNavigationController = [[UINavigationController alloc] initWithRootViewController:viewController];

그리고 결과 :

edgeForExtendedLayout을 설정하면보기가 탐색 바로 아래에 있습니다.


자동으로 ScrollViewInsets 조정

이 속성은보기 UIScrollView가과 같거나 유사 할 때 사용됩니다 UITableView. 탐색 막대가 끝나는 곳에서 테이블을 시작하려고합니다. 전체 내용이 표시되지는 않지만 스크롤 할 때 테이블이 전체 화면을 덮게하기 때문입니다. 이 경우 edgesForExtendedLayout탐색 표시 줄이 끝나는 곳에서 테이블이 스크롤을 시작하고 뒤로 이동하지 않기 때문에 없음으로 설정 하면 작동하지 않습니다.

뷰 컨트롤러가 인셋을 자동으로 조정하게하면 (이 속성을 YES로 설정하고 기본값으로 설정) 테이블 상단에 인셋을 추가하므로 탐색이 시작되는 위치에서 테이블이 시작됩니다. 막대가 끝나지만 스크롤이 전체 화면을 덮습니다.

이것은 NO로 설정된 경우입니다.

표가 전체 화면을 스크롤하지만 부분적으로 시작됩니다.

그리고 YES (기본) :

표가 전체 화면을 스크롤하고 탐색 바로 아래에서 시작됩니다.

두 경우 모두 테이블이 탐색 모음 뒤로 스크롤되지만 두 번째 경우 (YES) 탐색 모음 아래에서 시작됩니다.


extendedLayoutInpasOpaqueBars를 포함합니다

이 값은 이전 값에 추가 된 것입니다. 기본적으로이 매개 변수는 NO로 설정되어 있습니다. 상태 표시 줄이 불투명 한 경우,보기는 당신이 그것을 (커버하는보기 확장되는 경우, 상태 표시 줄을 포함하도록 확장되지 않습니다 edgesForExtendedLayout에를 UIRectEdgeAll).

값을 YES로 설정하면 뷰가 상태 표시 줄 아래로 다시 이동할 수 있습니다.

분명하지 않은 내용이 있으면 의견을 작성하고 답변 해 드리겠습니다.

iOS는 어떤 UIScrollView를 사용해야하는지 어떻게 알 수 있습니까?

iOS는 ViewController보기에서 첫 번째 하위보기 (인덱스 0)를 가져오고 하위 클래스 인 UIScrollView경우 설명 된 속성을 적용합니다.

물론 이것은 UITableViewController기본적으로 작동 한다는 것을 의미합니다 ( UITableView첫 번째보기 이므로 ).


기본 탐색 표시 줄을 표시하는 경우에만 맞춤 속성 탐색 표시 줄이 아닌 경우에만이 속성을 설정해야합니까?
Hemang

1
아니요, iOS 탐색 막대를 사용하지만 고유 한 디자인을 사용하는 경우 동일한 속성을 사용해야합니다. 탐색 모음을 처음부터 새로 만들면 해당 속성이 작동하지 않습니다.
Antonio MG

왜 전체보기에 작은 검은 색 레이어가 있는지 모르겠습니다. 도와주세요? : /
aZtraL-EnForceR

24
이 설명은 iOS 7 UI 전환 안내서보다 훨씬 낫습니다. 이것은 나에게 이해가되지 않는 가이드를 대체해야합니다.
Sam

2
extendedLayoutIncludesOpaqueBars는 기본적으로 NO 대신 YES이어야한다고 생각합니다. 뷰 색상 (반투명)을 변경하면 레이아웃에 영향을 미치지 않아야합니다.
Vladimír Slavík

15

스토리 보드를 사용하고 있는지 확실하지 않지만 사용중인 경우 뷰 컨트롤러가 상태 표시 줄 아래 (및 하단 표시 줄)를 시작하도록합니다.

IB에서 뷰 컨트롤러를 선택하고 속성 관리자에서 '가장자리 확장-상단 막대 아래'및 '가장자리 확장-하단 막대 아래'를 선택 취소합니다.


확인. 그런 다음 Nandha가 위에서 제안한 내용이 프로그래밍 방식으로 동일한 결과를 얻을 것이라고 생각합니다. viewDidLoad에서 작동하지 않으면 viewDidLayoutSubviews로 이동해야 할 수 있습니다.
Ali Beadle

확장 레이아웃에 불투명 막대가 포함되는지 여부를 나타냅니다. @property (nonatomic, assign) BOOL extendedLayoutIncludesOpaqueBars 토론 기본값은 NO입니다.
Abdul Yasin

+1, 당신은 스토리 보드에서 확인할 힌트를주었습니다. 그리고 내 문제의 절반을 해결했습니다.
selva

10

스토리 보드를 사용하고 위의 조언을 사용했지만 제대로 구현하지 못했습니다. 아래는 권장 솔루션을 ViewController에 넣어 문제를 해결하는 방법에 대한 간단한 예입니다.

import Foundation
import UIKit

// This ViewController is connected to a view on a storyboard that 
// has a scrolling sub view.
class TheViewController: UIViewController {

  // Prepares the view prior to loading.  Putting it in viewDidAppear didn't work.
  override func viewWillAppear(animated: Bool) {

    // this method is an extension of the UIViewController 
    // so using self works as you might expect.
    self.automaticallyAdjustsScrollViewInsets = false

    // Default is "true" so this sets it to false tells it to use 
    // the storyboard as you have it placed
    // and not how it thinks it should place it.
  }

}

내 문제 : 스토리 보드 디자인과 시뮬레이터의 차이를 일으키는 기본 설정 인 자동 조정이 true로 설정되었습니다. 스토리 보드 디자인과 시뮬레이터의 차이를 유발하는 자동 조정이 기본적으로 true로 설정 됨

해결 : 위의 코드가 적용되어 자동 조정 기능이 꺼집니다. 위의 코드를 적용하여 자동 조정을 끕니다.


5
automaticAdjustsScrollViewInsets를 YES로 설정 한 경우 topGuideLayout이 아닌 superview로 top constraint를 설정해야합니다.
xmkevinchen

5

나는이 줄을 추가하여이 문제를 해결하지만, 내 문제는 관련되었다 UIView,하지UIScrollView

self.navigationController.navigationBar.translucent = NO;

2

automaticallyAdjustsScrollViewInsets 스크롤보기 (테이블보기, 컬렉션보기 ...)의 일종 인 경우에만 속성이 작동 한다는 것을 명심하십시오.

  • VC의 관점 또는
  • 이 견해의 첫 번째 서브 뷰

다른 첫 번째 하위 뷰인 경우에도 작동하지 않지만 뷰 계층 구조에 다른 스크롤 뷰가 있다고 제안했습니다.

편집 (확장 DIY)

이러한 조건을 충족 할 수없는 경우에도 유사한 동작을 원할 경우 (예 : 스크롤보기 아래에 배경 이미지가있는 경우) 스크롤보기 삽입을 수동으로 조정할 수 있습니다. 그러나 44 또는 64 또는 20과 같이 일정하게 설정하지 마십시오. 당신은 이제까지 크기를 알 수 없습니다. incall / gps / audio 알림이있을 수 있으며, 탐색 표시 줄이 항상 44pt 일 필요는 없습니다.

가장 좋은 해결책은 didLayoutSubviews length에서 layoutGuide 를 사용하는 것 입니다.

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    scrollView.contentInset = UIEdgeInsets(top: topLayoutGuide.length, left: 0, bottom: 0, right: 0)
    scrollView.scrollIndicatorInsets = scrollView.contentInset
}

bottomLayoutGuide를 같은 방식으로 사용할 수 있습니다.


그리고 내비게이션 바는 반투명합니다.
Vojta Rujbr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.