IT TIP

iOS 7 — navigationController가 UIScrollView의 contentInset 및 ContentOffset을 설정합니다.

itqueen 2020. 11. 2. 20:10
반응형

iOS 7 — navigationController가 UIScrollView의 contentInset 및 ContentOffset을 설정합니다.


UIScrollView가 있습니다 (실제로는 UICollectionView이지만 아마도 중요하지 않습니다). IOS 7에 표시되면 내비게이션 컨트롤러는 contentInset 및 contentOffset을 원하지 않는 값으로 설정합니다. 상태 표시 줄과 탐색 표시 줄을 조정하려는 것 같습니다. 나는 그것이 그들을 내버려 두는 것을 매우 선호합니다. 이 문제를 해결하려면 contentInset 및 contentOffset에 대한 getter 및 setter 메서드를 개체에 집합을 허용할지 여부를 알려주는 플래그를 사용하여 재정의했습니다. 그러나 더 나은 방법이 있습니까?


self.automaticallyAdjustsScrollViewInsets = NO메인 뷰 컨트롤러에서 설정해보세요 .

이 기능이 도입 iOS 7되었으므로 지원하는 경우 iOS 버전 확인으로 래핑 할 수 iOS 6있습니다.


최신 정보

스토리 보드를 사용하는 경우 'Adjust Scroll View Insets'선택한 컨트롤러를 확인 하는 것 뿐만 아니라 인터페이스 빌더에서도이를 수행 할 수 있습니다 .

여기에 이미지 설명 입력


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

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

다음과 같은 상위 뷰의 첫 번째 컨트롤입니다.

전에

ImageView 바로 뒤에 tableView를 옮겼고 작동했습니다.

후

테이블 뷰를 첫 번째 위치에 놓는 것이 문제를 일으키는 것으로 보이며 테이블 뷰를 다른 위치로 이동하면 문제가 해결되었습니다.

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

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


두 가지 해결책이 있습니다.

1.

self.view = scrollView;

2.

[self.navigationController.toolbar setTranslucent:NO];

나는 같은 문제가 있습니다.

  1. 설정 self.automaticallyAdjustsScrollViewInsets = NO은 일부보기에 대한 문제를 해결했지만 모든 곳이 아닙니다.

  2. 두 번째 해결책은 viewWillLayoutSubviews에서 tableview / view / scrollview의 콘텐츠 오프셋을 설정하는 것입니다.

    - (void)viewWillLayoutSubviews {
        //Arrange the view
        CGRect tempViewFrame = self.view.frame;
    
        if (tempViewFrame.origin.y == 64.0f) {
            tempViewFrame.origin.y = 0;
            self.view.frame = tempViewFrame;
        }
    }
    

이것으로 충분합니다

- (void)viewDidLoad {

    [super viewDidLoad];

    self.automaticallyAdjustsScrollViewInsets = NO;

다음과 같은 경우 두 경우 모두 문제가 해결됩니다.

  1. 상태 표시 줄 표시
  2. 상태 표시 줄 + 탐색 표시 줄 표시

    override func viewDidLayoutSubviews() {
            NSLog("ORIGIN: \(self.view.frame.origin.y)")
    
        if self.view.frame.origin.y == 0 {
            if let rect = self.navigationController?.navigationBar.frame {
                let y = rect.size.height + rect.origin.y
                self.tableView.contentInset = UIEdgeInsetsMake(y, 0, 0, 0)
            }
        } else if self.view.frame.origin.y == 44 || self.view.frame.origin.y == 64 {
            self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)
        }
    }
    

다른 답변은 당신에게 효과가 있을지 모르지만 나에게는 효과가 없었습니다. 나를 위해 일한 y것은 contentOffsetin viewDidLayoutSubviews속성 을 수동으로 설정하는 것이 었습니다 viewWillAppear.

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    // Set the offset to go below the status bar
    collectionView.contentOffset.y = -UIApplication.shared.statusBarFrame.height
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // Set the offset to go below the status bar
    collectionView.contentOffset.y = -UIApplication.shared.statusBarFrame.height
}

제 경우에는 컨트롤러가 자식 컬렉션 뷰를 가지고 있었는데,이 뷰는 때때로 contentOffset조정되고 다른 때는 그렇지 않습니다. 내가 정규화 한 방식은 매번 수동으로 조정하는 것이 었습니다. 콘텐츠가 상태 표시 줄 아래로 오프셋되기를 원했기 때문에 상태 표시 줄 높이를 값으로 사용했습니다 (콘텐츠를 아래로 내리길 원하기 때문에 음수).

참고 URL : https://stackoverflow.com/questions/18924431/ios-7-navigationcontroller-is-setting-the-contentinset-and-contentoffset-of-m

반응형