iOS7 UI 전환에 대해 많이 읽었습니다.
내가 뭘 이러한 세 가지 속성을 얻을 수 아니에요 automaticallyAdjustsScrollViewInsets
, extendedLayoutIncludesOpaqueBars
, edgesForExtendedLayout
??
예를 들어 뷰 컨트롤러를 상태 표시 줄 아래에서 시작하려고하지만 달성 할 수 없습니다.
iOS7 UI 전환에 대해 많이 읽었습니다.
내가 뭘 이러한 세 가지 속성을 얻을 수 아니에요 automaticallyAdjustsScrollViewInsets
, extendedLayoutIncludesOpaqueBars
, edgesForExtendedLayout
??
예를 들어 뷰 컨트롤러를 상태 표시 줄 아래에서 시작하려고하지만 달성 할 수 없습니다.
답변:
iOS7부터 뷰 컨트롤러는 기본적으로 전체 화면 레이아웃을 사용합니다. 동시에 뷰를 배치하는 방법을 더 잘 제어 할 수 있으며 이러한 속성을 사용하여 수행됩니다.
edgeForExtendedLayout
기본적으로이 속성을 사용하면 전체 화면을 덮도록보기의 측면을 확장 할 수 있습니다. 당신이 밀어 상상해 UIViewController
에 UINavigationController
. 해당 뷰 컨트롤러의 뷰가 배치되면 내비게이션 바가 끝나는 위치에서 시작되지만이 속성은 뷰의 어느 쪽 (위쪽, 왼쪽, 아래쪽, 오른쪽)을 확장하여 전체 화면을 채울 수 있는지를 설정합니다.
예를 들어 보자.
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];
그리고 결과 :
자동으로 ScrollViewInsets 조정
이 속성은보기 UIScrollView
가과 같거나 유사 할 때 사용됩니다 UITableView
. 탐색 막대가 끝나는 곳에서 테이블을 시작하려고합니다. 전체 내용이 표시되지는 않지만 스크롤 할 때 테이블이 전체 화면을 덮게하기 때문입니다. 이 경우 edgesForExtendedLayout
탐색 표시 줄이 끝나는 곳에서 테이블이 스크롤을 시작하고 뒤로 이동하지 않기 때문에 없음으로 설정 하면 작동하지 않습니다.
뷰 컨트롤러가 인셋을 자동으로 조정하게하면 (이 속성을 YES로 설정하고 기본값으로 설정) 테이블 상단에 인셋을 추가하므로 탐색이 시작되는 위치에서 테이블이 시작됩니다. 막대가 끝나지만 스크롤이 전체 화면을 덮습니다.
이것은 NO로 설정된 경우입니다.
그리고 YES (기본) :
두 경우 모두 테이블이 탐색 모음 뒤로 스크롤되지만 두 번째 경우 (YES) 탐색 모음 아래에서 시작됩니다.
extendedLayoutInpasOpaqueBars를 포함합니다
이 값은 이전 값에 추가 된 것입니다. 기본적으로이 매개 변수는 NO로 설정되어 있습니다. 상태 표시 줄이 불투명 한 경우,보기는 당신이 그것을 (커버하는보기 확장되는 경우, 상태 표시 줄을 포함하도록 확장되지 않습니다 edgesForExtendedLayout
에를 UIRectEdgeAll
).
값을 YES로 설정하면 뷰가 상태 표시 줄 아래로 다시 이동할 수 있습니다.
분명하지 않은 내용이 있으면 의견을 작성하고 답변 해 드리겠습니다.
iOS는 어떤 UIScrollView를 사용해야하는지 어떻게 알 수 있습니까?
iOS는 ViewController보기에서 첫 번째 하위보기 (인덱스 0)를 가져오고 하위 클래스 인 UIScrollView
경우 설명 된 속성을 적용합니다.
물론 이것은 UITableViewController
기본적으로 작동 한다는 것을 의미합니다 ( UITableView
첫 번째보기 이므로 ).
스토리 보드를 사용하고 있는지 확실하지 않지만 사용중인 경우 뷰 컨트롤러가 상태 표시 줄 아래 (및 하단 표시 줄)를 시작하도록합니다.
IB에서 뷰 컨트롤러를 선택하고 속성 관리자에서 '가장자리 확장-상단 막대 아래'및 '가장자리 확장-하단 막대 아래'를 선택 취소합니다.
스토리 보드를 사용하고 위의 조언을 사용했지만 제대로 구현하지 못했습니다. 아래는 권장 솔루션을 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로 설정되었습니다.
해결 : 위의 코드가 적용되어 자동 조정 기능이 꺼집니다.
automaticallyAdjustsScrollViewInsets
스크롤보기 (테이블보기, 컬렉션보기 ...)의 일종 인 경우에만 속성이 작동 한다는 것을 명심하십시오.
다른 첫 번째 하위 뷰인 경우에도 작동하지 않지만 뷰 계층 구조에 다른 스크롤 뷰가 있다고 제안했습니다.
편집 (확장 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를 같은 방식으로 사용할 수 있습니다.