Programing

IOS7 : UINavigationController의 UIScrollView 오프셋

lottogame 2020. 7. 5. 21:11
반응형

IOS7 : UINavigationController의 UIScrollView 오프셋


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

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

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

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

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


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


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

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

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

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


편집하다

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


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

self.automaticallyAdjustsScrollViewInsets = false

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

The only documentation i found was there:

Update

In iOS 11 automaticallyAdjustsScrollViewInsets is deprecated

You should now use:

self.tableView.contentInsetAdjustmentBehavior = .never

I also encourage you to check this question and its answer to get a better understanding of those properties


@Justafinger's answer worked like a charm for me as well.

Just wanted to add that this setting can also be adjusted easily from the interface builder.

  1. Select your view controller
  2. Click the 'Attributes Inspector' tab
  3. Uncheck 'Adjust Scroll View Insets'
  4. Enjoy!

enter image description here


I was running into this same issue, but I found a rather odd property on the ViewController in interface builder that seems to have been causing this for me. There is an "Extend Edges" set of check boxes. I removed the "Under Top Bars" check, and everything started laying out properly for me.


With automaticallyAdjustsScrollViewInsets set to YES (the default setting) there is a mismatch in scrollview positioning between ios6 and ios7, so to make them consistent you need to disable this setting. However, ios6 will crash if it comes across automaticallyAdjustsScrollViewInsets, so you either need to make a programatic change of automaticallyAdjustsScrollViewInsets conditional on ios7 or else switch off the option using the storyboard/NIB


I had a similar problem, after dismissing a viewController, the contentOffset from my tableView was changed to (0, -64).

my solution was a little weird, I tried all the other answers but had no success, the only thing that fixed my problem was to switch the tableView position in the controls tree of the .xib

it was the first control in the parent View like this:

before

I moved the tableView right after the ImageView and it worked:

after

it seems that putting the table view in the first position was causing the trouble, and moving the table view to another position fixed the problem.

P.D. I'm not using autoLayout neither storyboards

hope this can help someone!


I also face this problem.

UIScrollView content size is calculate by OS as other sizes, origins provided by constraint system - that's why OS has doubtfulness.

How to fix - You should explicitly define content size of UIScrollView:

  1. Embed scrollable content to UIView (I rename it to ContentView)
  2. Add constraints:

ContentView.Weight = View.Weight and ContentView.Height = View.Height

enter image description here


It seems like a work around solution is to view the storyboard file as "iOS 6.1 and earlier" (select storyboard file->File inspector->Interface Builder Document->View As. Positioning subviews in this mode shows the offset.


Thank you guys for the solutions! I struggled for hours trying to solve the problem. Everything was ok when there was no Navigation Bar involved but it went haywire the moment I embedded the ViewController in a NavigationController.

I solved it by unchecking the Adjust Scroll View Insets and the Under Top Bars. Both of these are located in the ViewController's Attribute Inspector. Thanks a million!

참고URL : https://stackoverflow.com/questions/18967859/ios7-uiscrollview-offset-in-uinavigationcontroller

반응형