IOS7 : UINavigationController의 UIScrollView 오프셋


126

현재 iOS 7에서 앱을 마이그레이션하고 있으며 새로운 내비게이션 컨트롤러 / 바 관리에 몇 시간 동안 붙어 있습니다.

이전에 내비게이션 컨트롤러를 사용했을 때 다음과 같은 스 니펫이있었습니다.

UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:[[MainViewController alloc]init]];

인터페이스 빌더에서 뷰에 대한 기존 탐색 막대를 설정하고 모든 것이 실제 뷰의 컨텐츠와 일치하도록 선택할 수있었습니다.

이제 인터페이스 빌더로 올바르게 디자인하는 방법에 대한 단서가 없습니다. 내 navcontroller를 초기화하는 스 니펫이 계속 있습니다. 그러나 내 MainViewController의 인터페이스 빌더에서 상태 표시 줄을 반투명 또는 불투명 탐색 표시 줄로 설정하면 상단에 44px의 오프셋이 있습니다 (아래 참조).


인터페이스 빌더 _________________________ 그리고 결과


이제 상태 표시 줄을 없음으로 설정하면 상단에 오프셋이 없지만 탐색 모음으로 인해 시뮬레이터의 뷰가 작기 때문에 인터페이스 빌더의 뷰 하단이 잘립니다.

인터페이스 빌더 _________________________ 그리고 결과

나는 실제로 여기에 뭔가 빠져 있다고 생각하지만 iOS7 전환 가이드에서 어떤 주제 나 사과 정보를 찾을 수 없습니다.

당신의 도움을 주셔서 감사합니다


편집하다

그림에서 볼 수 있듯이보기의 첫 번째 자식은 두 레이블을 모두 포함하는 UIScrollView이며, 스크롤보기가 없으면 문제가 나타나지 않습니다. UITableView 인 경우에도 나타납니다. 레이블이 UIScrollView 외부에 있으면 해당 레이블에 대한 오프셋이 없습니다.


당신이하지 않은 경우 당신이 할 수 있도록 당신은 확실히 특정 뷰는 멀리 화면의 위 / 아래 / 옆에서 세트 거리이며, 자동 레이아웃을 사용할 수 있습니다
erdekhayser

실제로 자동 레이아웃을 사용하지 않지만 확인란을 선택해도 문제가 해결되지 않습니다.
streem

자동 레이아웃을 사용하면 뷰가 그대로 유지되도록 구속 조건을 설정해야합니다. Xcode는 자동으로 원하는 것을 알지 못합니다.
erdekhayser

이전 수정 사항을보고 방금 문제를 발견했습니다. 불행히도, 가장 확실한 해결책은 아닙니다. 다시 한 번 설명하려고하는 것이 아니라 YouTube에서이 비디오를 사용하여 스크롤보기를 설정하는 방법을 배웠습니다. youtube.com/watch?v=PgeNPRBrB18&feature=youtu.be 행운을 빈다. 그가 무엇을하고 있는지 완전히 이해하기 위해 몇 시간이 걸렸습니다.
erdekhayser

답변:


286

좋아, 솔루션을 찾았고 컨트롤러에서 속성을 설정했습니다.

self.automaticallyAdjustsScrollViewInsets = false

그래도이 속성의 진정한 이점을 이해하지 못합니다 (또는 기본값이 true 인 이유).

내가 찾은 유일한 문서는 다음과 같습니다.

최신 정보

iOS 11에서 automaticallyAdjustsScrollViewInsets 에서는 더 이상 사용되지 않습니다.

이제 다음을 사용해야합니다.

self.tableView.contentInsetAdjustmentBehavior = .never

또한 이 질문 과 답변을 확인하여 해당 속성을 더 잘 이해하는 것이 좋습니다.


12
좋은 발견. 스토리 보드의 UIScrollView는 정말 복잡합니다. Apple이 향후 Xcode 버전에서 약간 매끄럽게 만들기를 바랍니다.
p0lAris

4
이 코드는 UIScrollView스크롤 하지 못하게 합니다. 그러나 이것이 없으면 오프셋을 제거 할 수 없습니다. Weired ...
scaryguy

9
이 플래그는 스토리 보드 / 니브에서도 끌 수 있습니다. View Controller에는 "스크롤보기 삽입 조정"확인란이 있습니다. iOS 6 및 7을 지원하여 더 복잡하게 스크롤보기 및 자동 레이아웃과 관련된 문제를 해결하려고 노력하면서 오랫동안 벽에 머리를 대고 있습니다.
Newtz

2
응용 프로그램 문서는 navigationbar.translucent = YES를 설정하면 탐색 표시 줄이 내용을 아래로 밀지 못하게합니다. 그것은 가장 큰 거짓말 이며이 게시물까지 많은 시간을 소비했습니다. 또한 self.automaticallyAdjustsScrollViewInsets = NO를 설정해야합니다. 이 게시물에 정말 감사합니다 !!!!!!! 사과와 사과?
user779764

이로 인해 내 UIScrollView의 경계가 탐색 막대의 높이 (-64 점)만큼 아래로 이동한다는 것을 알았습니다. 수동으로이 값을 0으로 대체했지만 UISrollView가 여전히 y 축에서 스크롤되고 -64의 가상 선에 "스냅"되는 것을 발견했습니다. 귀하의 솔루션이 이것을 해결했습니다.
gdbj

92

@Justafinger의 대답은 저에게도 매력처럼 작용했습니다.

이 설정은 인터페이스 빌더에서 쉽게 조정할 수 있다는 점을 추가하고 싶었습니다.

  1. 뷰 컨트롤러를 선택하십시오
  2. '속성 관리자'탭을 클릭하십시오.
  3. '스크롤보기 삽입 조정'을 선택 해제하십시오.
  4. 즐겨!

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


뷰 컨트롤러가 아닌 UIScrollView 속성에서이 옵션을 찾고있는 연령대! 감사!
Dominic Williams

11

이 같은 문제가 발생했지만 인터페이스 빌더의 ViewController에서 다소 이상한 속성을 발견했습니다. "가장자리 확장"확인란이 있습니다. "Under Top Bars"체크를 제거하고 모든 것이 제대로 배치되기 시작했습니다.


네, 이건 "Adjust Scroll View Insets"보다 좋았습니다
Dmytro

2

automaticAdjustsScrollViewInsets를 YES (기본 설정)로 설정하면 ios6과 ios7 사이의 스크롤보기 위치가 일치하지 않으므로 일관성을 유지하려면이 설정을 비활성화해야합니다. 그러나 ios6이 자동으로 AdjustsScrollViewInsets를 만나면 충돌이 발생하므로 ios7에서 조건부로 자동 AdAdssScrollViewInsets를 프로그래밍 방식으로 변경하거나 스토리 보드 / NIB를 사용하여 옵션을 해제해야합니다


2

viewController를 닫은 후 비슷한 문제가 발생하여 tableView의 contentOffset이 (0, -64)로 변경되었습니다.

내 솔루션은 조금 이상했습니다. 다른 모든 답변을 시도했지만 성공하지 못했습니다. 문제를 해결 한 유일한 것은 .xib의 컨트롤 트리에서 tableView 위치를 전환하는 것이 었습니다.

다음과 같이 부모보기에서 첫 번째 컨트롤이었습니다.

전에

ImageView 바로 다음에 tableView를 이동했으며 작동했습니다.

후

테이블 뷰를 첫 번째 위치에 놓으면 문제가 발생하고 테이블 뷰를 다른 위치로 이동하면 문제가 해결 된 것으로 보입니다.

PD 나는 autoLayout도 스토리 보드를 사용하지 않습니다

이것이 누군가를 도울 수 있기를 바랍니다!


나는이 이상한 행동을 알아 차렸다. 나는 뒤에있는 논리는 scrollView가 첫 번째 자식 일 때 scrollViewInsets가 자동으로 조정된다고 믿는다. 그렇지 않으면 스크롤보기가 전체 화면이 아니기 때문에 실제로 의미가 없습니다.
streem

1

나는 또한이 문제에 직면한다.

UIScrollView 콘텐츠 크기는 제약 시스템에서 제공하는 다른 크기, 원점으로 OS별로 계산되므로 OS에 의심이 있습니다.

수정 방법-콘텐츠 크기를 명시 적으로 정의해야합니다 UIScrollView.

  1. 스크롤 가능한 콘텐츠를에 삽입 UIView(이름을으로 변경 ContentView)
  2. 구속 조건 추가 :

ContentView.Weight = View.WeightContentView.Height = View.Height

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


0

해결 방법은 스토리 보드 파일을 "iOS 6.1 이하"로 보는 것입니다 (스토리 보드 파일-> 파일 관리자-> 인터페이스 빌더 문서-> 다른 이름으로보기를 선택하십시오.이 모드에서 서브 뷰 위치 지정은 오프셋을 보여줍니다.


글쎄, 나는 스토리 보드를 사용하지 않습니다. 그러나 그것이 iOS 7에서 ios7 문제인지 확실하지 않습니다. 위의 예는 iOS 7에서 완전히 생성되었습니다. 또한 내 질문을 편집하면 uiscrollview 및 uitableview와 함께 (내가 아는 한) 나타납니다.
streem

흠 흥미로운 ...이를 살펴보면 문서 요소의 XIB 상단에 variant = "6xAndEarlier"를 추가 할 수 있습니다. 위에서 언급 한 비트를 뒤집을 때의 차이점입니다. 그리고 참고 로이 문제는 uiwebview에서도 발생합니다.
swhitman

0

솔루션 주셔서 감사합니다! 나는 문제를 해결하기 위해 몇 시간 동안 고심했다. 내비게이션 바가 없었을 때 모든 것이 괜찮 았지만 NavigationController에 ViewController를 내장 한 순간 건초가되었습니다.

Scroll View InsetsUnder Top Bars 를 선택 해제하여 해결했습니다 . 둘 다 ViewController의 속성 관리자에 있습니다. 정말 감사합니다!

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