내 응용 프로그램의 첫 번째 화면 UITableViewController
에는 탐색 표시 줄 이 없습니다. 즉, 내용이 상태 표시 줄 아래로 흐르므로 많은 텍스트 충돌이 발생합니다. 두 속성을 모두 조정했습니다.Under top bars
하고 Adjust scroll view insets
있는 사실에서 스크롤을 중지 않지만, 아래 테이블 뷰의 상단을 유지하는 비용. UITableView
프레임을 20 픽셀 오프셋 으로 설정하려고 시도했지만 효과가없는 것 같습니다. 현재 iOS 6과 호환되는 앱이 필요하므로 자동 레이아웃을 사용하도록 iOS 7 스토리 보드로 이동할 수 없습니다 상단 높이 가이드. 누구든지 두 버전 모두에서 작동하는 솔루션을 찾았습니까?
내가 시도한 것 : 설정 edgesForExtendedLayout
, 스토리 보드에서 설정 변경Under top bars
하고 Adjust scroll view
, 새로운 영역으로 프레임을 강제.
그림은 천 단어의 가치가 있습니다.
답변
이 복제에 관심이있는 사람은 다음 단계를 따르십시오.
- 새로운 iOS 프로젝트 생성
- 메인 스토리 보드를 열고 기본 / 초기화를 삭제하십시오
UIViewController
UITableViewController
객체 라이브러리에서 새 항목 을 드래그- 초기 뷰 컨트롤러로 설정
- 테스트 데이터를 테이블에 공급
위의 단계를 수행하면 앱을 실행할 때 Xcode의 확인란을 “{Top, Bottom, Opaque} Bar 아래의 가장자리 확장”으로 조정하여 첫 번째 행이 상태 표시 줄 아래에 나타나지 않게하는 등 아무것도 작동하지 않습니다. 프로그래밍 방식으로이 문제를 해결할 수도 없습니다.
예를 들어, 위 시나리오에서는 다음과 같은 효과 가 없습니다 .
// These do not work
self.edgesForExtendedLayout=UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars=NO;
self.automaticallyAdjustsScrollViewInsets=NO;
이 문제는 매우 실망 스러울 수 있으며 특히 Apple의 사전 배선 된 버그로 인해 Apple의 버그라고 생각합니다. UITableViewController
객체 라이브러리에서 입니다.
“매직 숫자 20″과 같은 “매직 숫자”형식을 사용하여이 문제를 해결하려는 모든 사람에게 동의하지 않습니다. 이런 종류의 밀접하게 결합 된 프로그래밍은 분명히 애플이 우리가 원하는 것이 아닙니다.
이 문제에 대한 두 가지 해결책을 발견했습니다.
-
보존
UITableViewController
의 장면을 :
당신은 유지하려는 경우UITableViewController
수동으로 다른보기로 배치하지 않고, 스토리 보드에서, 당신은을 포함 할 수 있습니다UITableViewController
A의UINavigationController
인스펙터에서 (편집자> 삽입에서> 네비게이션 컨트롤러)의 선택을 취소 “쇼 탐색 막대” . 이를 통해 추가 조정이 필요없는 문제를 해결UITableViewController
하고 스토리 보드의 장면을 보존 할 수 있습니다 . -
AutoLayout을 사용하고
UITableView
다른보기에 포함 (Apple이 우리가 원하는 방식이라고 생각합니다) :
빈을UIViewController
만들고 드래그하십시오UITableView
. 그런 다음 Ctrl 키를 누른UITableView
상태에서 상태 표시 줄을 향해 드래그하십시오 . 마우스가 상태 표시 줄의 맨 아래로 이동하면 “Top Layout Guide”라는 자동 레이아웃 풍선이 나타납니다. 마우스를 놓고 “수직 간격”을 선택하십시오. 레이아웃 시스템에 상태 표시 줄 바로 아래에 배치하도록 지시합니다.
빈 응용 프로그램에서 두 가지 방법을 테스트했으며 모두 작동합니다. 프로젝트에서 작동하도록 추가 조정을 수행해야 할 수도 있습니다.
답변
프로그래밍 방식으로 일을하고 최선의 방법 UITableViewController
없이 사용하는 UINavigationController
경우 다음을 수행하는 것입니다 viewDidLoad
.
스위프트 3
self.tableView.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0)
이전 스위프트
self.tableView.contentInset = UIEdgeInsetsMake(20.0f, 0.0f, 0.0f, 0.0f);
는 UITableViewController
여전히 상태 표시 줄 뒤로 스크롤하지만 정상에 스크롤 할 때 아래되지 않습니다.
답변
참고 : 이것은 다음 구성에서 효과적이었습니다.
- 화면 상단에 탐색 표시 줄이 없습니다 (테이블보기가 상태 표시 줄을 충족 함)
- 테이블 뷰는 스크롤 할 수 없습니다
위의 두 가지 요구 사항이 충족되지 않으면 마일리지가 다를 수 있습니다.
원본 게시물
프로그래밍 방식으로 뷰를 만들었고 결국 나에게 도움이되었습니다.
- (void) viewDidLayoutSubviews {
// only works for iOS 7+
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
CGRect viewBounds = self.view.bounds;
CGFloat topBarOffset = self.topLayoutGuide.length;
// snaps the view under the status bar (iOS 6 style)
viewBounds.origin.y = topBarOffset * -1;
// shrink the bounds of your view to compensate for the offset
viewBounds.size.height = viewBounds.size.height + (topBarOffset * -1);
self.view.bounds = viewBounds;
}
}
출처 ( 39 페이지 하단의 topLayoutGuide 섹션).
답변
최고 답변에 추가 :
두 번째 방법이 처음에는 효과가없는 것처럼 보였지만 추가 땜질을하고 해결책을 찾았습니다.
TLDR; 최상위 답변의 두 번째 솔루션은 거의 작동하지만 일부 버전의 xCode ctrl + dragging은 “Top Layout Guide”로 수직 간격을 선택해도 아무런 효과가 없습니다. 그러나 먼저 테이블 뷰의 크기를 조정 한 다음 “Top Space to Top Layout Guide”를 선택하면 작동합니다.
-
빈 ViewController를 스토리 보드로 드래그하십시오.
-
UITableView 객체 를 View로 드래그하십시오 . (UITableViewController가 아님). 파란색 레이아웃 안내선을 사용하여 가장 중앙에 배치하십시오.
- UITableViewCell을 TableView로 드래그하십시오. 이것은 프로토 타입 재사용 셀이므로 속성 탭에서 재사용 식별자를 설정해야합니다. 그렇지 않으면 충돌이 발생합니다.
-
UIViewController의 사용자 정의 서브 클래스를 작성하고
<UITableViewDataSource, UITableViewDelegate>
프로토콜을 추가하십시오 . Identity Inspector에서 스토리 보드의 ViewController를이 클래스로 설정하는 것을 잊지 마십시오. -
구현 파일에서 TableView에 대한 콘센트를 작성하고 이름을 “tableView”로 지정하십시오.
- TableView를 마우스 오른쪽 단추로 클릭하고 dataSource 및 대리자를 ViewController로 끕니다.
이제 상태 표시 줄에 클리핑하지 않는 부분에 대해 설명합니다.
- 테이블 뷰의 상단 가장자리를 잡고 상단 근처의 파란색 파선 자동 레이아웃 안내선 중 하나로 이동하십시오.
- 이제 테이블 뷰에서 상단으로 드래그를 제어하고 상단 공간에서 상단 레이아웃 안내를 선택할 수 있습니다.
- 누락 된 제약 조건 추가와 완료로 TableView의 모호한 레이아웃에 대한 오류가 발생합니다.
이제 테이블보기를 평소와 같이 설정할 수 있으며 상태 표시 줄을 자르지 않습니다!
답변
- (void) viewDidLayoutSubviews {
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
self.edgesForExtendedLayout = UIRectEdgeNone; // iOS 7 specific
CGRect viewBounds = self.view.bounds;
CGFloat topBarOffset = self.topLayoutGuide.length;
viewBounds.origin.y = topBarOffset * -1;
self.view.bounds = viewBounds;
self.navigationController.navigationBar.translucent = NO;
}
}
답변
스토리 보드에서 UIViewController를 선택하고 상단 막대 아래 모서리 확장 옵션을 선택 취소하십시오. 나를 위해 일했다. 🙂
답변
이것은 “Swift”에 쓰는 방법입니다. @lipka의 답변에 대한 조정 :
tableView.contentInset = UIEdgeInsetsMake(20.0, 0.0, 0.0, 0.0)