2017-11-11 14 views
1

UINavigationController의 탐색 모음을 숨김으로써 전체 화면 모드로 들어가는 코드가 있습니다. 전체 화면으로 전환 할 때 부드러운 애니메이션 확대/축소 효과를 원합니다. 나는 setNavigationBarHidden(_:animated:)을 사용한다. 지금까지 iOS 11에서도 모든 작업이 원활하게 진행되었지만 iPhone X에서는 애니메이션이 제대로 작동하지 않습니다. 숨어있을 때 애니메이션이없고 탐색 막대가 사라집니다. 숨기기 해제시 애니메이션이 적용되지만 탐색 막대의 콘텐츠 영역이 축소되는 속도보다 느린 속도로 탐색 막대가 표시되므로 애니메이션 중에 탐색 막대 영역을 통해 못 생기는 검정색 배경이 표시됩니다.setNavigationBarHidden 애니메이션이 iPhone X에서 예상대로 작동하지 않습니다.

간단한 테스트 앱에서 다시 만들 수 있습니다. UINavigationController에 포함 된 UIViewController가 있습니다.

스토리 보드

  • UINavigationController가 탐색 막대 : 스타일 == 블랙; 반투명 OFF
  • UIViewController : 가장자리 확장 : 모든 옵션이 해제됩니다.

제가 생각할 수있는 Adjust Scroll View Insets와 Extend Edge의 모든 조합을 시도했지만 별 차이가 없었습니다. 귀하의 경우에는

코드

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

    setFullScreen(on: fullScreen, animated: animated) 
} 

override var prefersStatusBarHidden: Bool 
{ 
    return fullScreen 
} 

override var preferredStatusBarStyle: UIStatusBarStyle 
{ 
    return .lightContent 
} 

@IBAction func onToggleNavBarVisibility(_ sender: Any) { 

    if let navBarHidden = self.navigationController?.isNavigationBarHidden { 
     // Toggle the state 
     fullScreen = !navBarHidden 

     setFullScreen(on: fullScreen, animated: true) 
    } 
} 

private func setFullScreen(on : Bool, animated : Bool) { 

    self.navigationController?.setNavigationBarHidden(on, animated: animated) 
    self.setNeedsStatusBarAppearanceUpdate() 
} 

Result on iPhone X (slow animations)

답변

1

당신은 둘 barTintColor & navigationBarStyleHideShow와 애니메이션을 사용하고 있습니다. barTintColor 당신은 난 그냥 barTintColor & navigationBarStyle을 사용하고 아래 코드에서 barTintColor 또는 navigationBarStyle 중 하나가 Transulent와 기본값 선택해야 스타일 속성에 의해 암시 된 값보다 우선합니다.

enter image description here

var fullScreen = false{ 
     didSet{ 
     self.setNeedsStatusBarAppearanceUpdate() 
    } 
    } 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     title = "Navigation Bar" 
     navigationController?.navigationBar.barTintColor = .red 
    } 
    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(true) 
     setFullScreen(on: fullScreen, animated: animated) 
    } 
    @IBAction func onToggleNavBarVisibility(_ sender: Any) { 
     if let navBarHidden = 
      self.navigationController?.isNavigationBarHidden { 
      // Toggle the state 
      fullScreen = !navBarHidden 
      setFullScreen(on: fullScreen, animated: true) 
     } 
    } 
    private func setFullScreen(on : Bool, animated : Bool) { 
     self.navigationController?.setNavigationBarHidden(on, animated: animated) 
     self.setNeedsStatusBarAppearanceUpdate() 
    } 

편집 : 는 부울 값으로 상태 바 - 사용 prefersStatusBarHidden을 숨기려면. 이미지가 올바르게 작동의 전환을 보여줍니다 때문에 & 사용 setNeedsStatusBarAppearanceUpdate

override var prefersStatusBarHidden: Bool { 
     return fullScreen 
    } 

https://developer.apple.com/documentation/uikit/uinavigationbar

+0

은 나를 더 문제를 이해했다. 코드가 작동하는 이유는 prefersStatusBarHidden 무시를 생략했기 때문입니다. 이것이 근본 원인 인 것 같습니다. 정말 문제는 "setNavigationBarHidden 애니메이션이 iPhone X에서 prefersStatusBarHidden과 작동하지 않습니다."입니다. PrefersStatusBarHidden 오버라이드를 주석 처리하면 코드가 작동하지만 물론 전체 화면 효과를 얻으려면 숨기려고합니다. (원래 코드는 iPhone X와는 다른 모든 iPhone 시뮬레이터에서 잘 작동합니다.) – Ben

+0

@Ben, EDIT를 참조하십시오. 필요에 따라 작동하며'prefersStatusBarHidden'을'UIApplication.shared.isStatusBarHidden = on'으로 바꿉니다.그러나 iPhone-X의 상태 표시 줄을 유지하는 것이 좋습니다. 사람들이 유용하다고 생각하는 정보가 상태 표시 줄에 표시됩니다. – Jack

+0

재미 있고 분명 도움이됩니다. 하지만 (1) 상태 표시 줄 사라짐이 애니메이션으로 나타나지 않고 'UIApplication.shared.setStatusBarHidden (on, with : : fade)'를 사용하면 '비추천 경고'가 표시됩니다. (2) '컨트롤러 기반 상태 표시 줄보기'는 Info.plist에서 요즘으로 간주됩니다. (3) 재현 애니메이션은 여전히 ​​적절하지 않습니다. 나는 버그 보고서가오고 있다고 느낀다 ... iPhone X의 사진 앱을 사용하는 경우, 상태 표시 줄이 전체 화면 모드로 숨겨져 있으므로 나는 일시적인 프리젠 테이션 이유로 그것을 할 수 있다고 생각한다. – Ben