2017-09-17 2 views
1

이 튜토리얼에 따라 statusBar smoothly hide statusBar을 부드럽게 숨기고 연습 프로젝트에서 사용할 때 모든 것이 잘 작동합니다. SplitVC가 없지만 tabBar가 있고 navVC & tableView를 사용하는 코드는 모두 프로젝트에서 사용됩니다. 나는 성공적으로 그것을 나타낼 수 있습니다/사라집니다.Swift iOS -SplitViewController로 StatusBar를 숨기지 않겠습니까?

저는 실제 프로젝트에서 iPad 용 SplitViewController를 사용하고 있습니다. statusBar가 숨기지 않을 SplitViewController 링크의 지시를 구현할 때 나타났습니다. 그런 다음 Apple의 기본 MasterDetailApp을 사용하여 새로운 프로젝트를 만들었습니다. 잘못된 작업을하지는 않았지만 제대로 작동하지 않습니다. 나는 애플의 원래 모든 코드를 유지 만/상태 표시가 나타나게 나는 View controller-based status bar appearance을 추가 info.plist

  1. 사라지고 나는 보라색을 추가 스토리 보드에 YES

  2. 로 설정하는 데 필요한 방법에 추가 버튼을 DetailVC로 이동하여 statusBar 사라짐을 트리거합니다. 나는 또한 backBar 버튼이 사라지거나 다시 나타나게하는 방법을 추가했습니다.

  3. statusBar가 DetailVC 장면에서 사라지거나 사라지게 만드는 모든 방법을 추가했습니다.

  4. 는 내가 마스터 현장에서 플러스 버튼을 클릭

enter image description here

enter image description here

상태 표시 및에서는 backButton이 다시 확인하기 위해 현장에 tapGesture을 추가, 날짜가 등장 그것을 클릭하여 DetailVC로 가고, 보라색 buttonPressed을 눌러 statusBar와 backButton을 감추었지만 backButton 만 감추어졌습니다. 나는 배경을 만지고 backButton이 다시 나타납니다. statusBar는 움직이지 않습니다.

나는 애플의 프로젝트에서 모든 원래의 코드를 유지하고 그 아래 광산 추가 :

class DetailViewController: UIViewController { 

    //MARK:- Apple's code 
    @IBOutlet weak var detailDescriptionLabel: UILabel! 

    func configureView() { 
     if let detail = detailItem { 
      if let label = detailDescriptionLabel { 
       label.text = detail.description 
      } 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     configureView() 

     // make backButton and statusBar reappear when scene is tapped 
     let tapGesture = UITapGestureRecognizer(target: self, action: #selector(showBackButtonAndStatusBar)) 
     view.addGestureRecognizer(tapGesture) 
    } 

    var detailItem: NSDate? { 
     didSet { 
      configureView() 
     } 
    } 

    //MARK:- Outside of the tapGesture in viewDidLoad everything below here is what I added 

    // bool to determine wether to hide the statusBar or not 
    var statusBarShouldBeHidden = false 

    // api method to allow the staus bar to be hidden 
    override var prefersStatusBarHidden: Bool{ 
     return statusBarShouldBeHidden 
    } 

    // api method to animate status bar appearance/disappearance 
    override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation{ 
     return .slide 
    } 

    @IBAction func buttonTapped(_ sender: UIButton) { 

     // 1. hide backBar button 
     navigationItem.setHidesBackButton(true, animated: false) 

     // 2. set bool to true 
     statusBarShouldBeHidden = true 

     UIView.animate(withDuration: 0.25){ 
      // 3. api method to allow the statusBar to disappear 
      self.setNeedsStatusBarAppearanceUpdate() 
     } 
    } 

    //called when background is touched and added to tapGesture in viewDidLoad 
    @objc func showBackButtonAndStatusBar(){ 

     // 1. set bool to false 
     statusBarShouldBeHidden = false 

     UIView.animate(withDuration: 0.25){ 
      // 2. bring statusBar back 
      self.setNeedsStatusBarAppearanceUpdate() 
     } 

     // 3. bring backButton back 
     navigationItem.setHidesBackButton(false, animated: true) 
    } 
} 

가 어떻게이 SplitViewVC 나를 상태 표시 줄을 숨길 수 있도록 얻을 수 있습니까?

+0

흥미 롭지 만 앱 (기본 설정)을 설정하면 숨길 수 있습니다. – Jageen

+0

해결 했습니까? – Jageen

+0

@ Jageen 나는 실제로 그것에 지쳐서 상태 표시 줄을 유지하기로 결정했다. SplitViewController는 내 iOS 시간에 모든 두통의 가장 큰 골칫거리가되어야합니다. SplitViewController 자체에서 변경해야하지만 SplitVC에 연결된 모든 자식 VC에 응용 프로그램을 적용하는 것이 문제 일 것입니다. 그 때 나는 "그것을 잊어 버려라."라고 말했을 때 –

답변

4

세부보기 컨트롤러를 통해 상태 표시 줄을 숨기려고 시도하는 것 같습니다. 사용자 인터페이스의 상태 표시 줄은보기 컨트롤러 계층의 맨 위에 있기 때문에 분할보기 컨트롤러에서만 제어됩니다. 따라서 상태 표시 줄의 동작을 제어하는 ​​가장 쉬운 방법은 UISplitViewController의 하위 클래스를 만든 다음 하위 클래스의 prefersStatusBarHidden 계산 된 속성을 재정의하는 것입니다. 또한 스토리 보드로 이동하여 ID 관리자에서 분할보기 컨트롤러의 사용자 정의 클래스 필드를 하위 클래스로 변경하십시오.

--- 업데이트 됨 --- @LanceSamaria 좋아요, 위의 코드를 가져 와서 몇 가지를 조정했습니다. 우선, 버튼 동작 만 추가하고 탭 동작은 추가하지 않았습니다. 또한 UI에서 중요한 점은 마스터보기로 되돌아 갈 수 있기 때문에 뒤로 버튼 숨기기를 주석 처리했습니다. 어쨌든 이제 버튼을 클릭하면 SplitViewController가 상태 표시 줄을 숨 깁니다. 버튼을 다시 클릭하면 상태 표시 줄이 다시 나타납니다.

수입 UIKit

클래스 DetailViewController : UIViewController에 또한 {

@IBOutlet weak var detailDescriptionLabel: UILabel! 

var statusBarShouldBeHidden = false 

func configureView() { 
    // Update the user interface for the detail item. 
    if let detail = self.detailItem { 
     if let label = self.detailDescriptionLabel { 
      label.text = detail.description 
     } 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    self.configureView() 
} 

/* override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation{ 
    return .slide 
} */ 


var detailItem: NSDate? { 
    didSet { 
     // Update the view. 
     self.configureView() 
    } 
} 

@IBAction func buttonTapped(_ sender: UIButton) { 
    // 1. hide backBar button 
    //navigationItem.setHidesBackButton(true, animated: false) 

    // 2. set bool to true 
    statusBarShouldBeHidden = !statusBarShouldBeHidden 

    UIView.animate(withDuration: 0.25){ 
     // 3. api method to allow the statusBar to disappear 
     guard let svc = self.splitViewController as? SplitViewController else { return } 
     svc.statusBarShouldBeHidden = self.statusBarShouldBeHidden 
     svc.setNeedsStatusBarAppearanceUpdate() 
    } 
} 

}

, 하나 개 더 정말 중요한 것은. 아래 분할보기 컨트롤러 하위 클래스에 대한 내 코드입니다. 분할 뷰 컨트롤러와 상세 컨트롤러 모두에서 동일한 변수 이름 "statusBarShouldBeHidden"을 사용합니다.

수입 UIKit

클래스 SplitViewController : UISplitViewController {

var statusBarShouldBeHidden = false 

override func viewDidLoad() { 
    super.viewDidLoad() 
} 

override var prefersStatusBarHidden: Bool { 
    return statusBarShouldBeHidden 
} 

}

이 질문을 게시 주셔서 감사합니다. 이것은 내가이 문제를 해결하려고 많은 것을 배우는 것을 도왔다. 이 점에 대해 아직 궁금한 점이 있으면 알려주십시오.

+1

대답 주셔서 감사합니다. 나는 실제로 당신이 제안한 것에 대해 생각해 봤지만, splitVC에 연결된 모든 VC가 내가 원하지 않는 상태 표시 줄을 제거했다는 것을 깨달았습니다. 나는 그 후 수건을 던져 상태 표시 줄을 유지하기로 결정했습니다. SplitVC는 두통입니다. 서브 클래 싱 된 모든 것이 이미 연결되어 있습니다. 내가 계속 실행하고있는 다른 모든 버그를 끝내고 나면 다시 돌아올 것이다. 나는 당신의 대답은 올바른 것이라고 생각하기 때문에 누군가가 모든 자식 vc가 상태 표시 줄을 없애기를 바란다고 생각하기 때문에 나는 당신을 업 그레 이드 할 것이다 –

+0

@LanceSamaria 안녕하세요, 스택 오버플로가 업데이트 된 답변을 알려줄지 모르겠다. 내가 너에게 알리려고해라. –

+0

당신의 답을 살펴 봤는데 당신은 탑 뷰 컨트롤러에서 그것을 바꿔야한다는 것이 맞습니다. 나는 자식 vc가 있었고 상태 막대를 숨길 수있는 유일한 방법은 부모 vc (navVC) 안에 숨기는 것이 었습니다. 나는 당신의 대답을 수용된 대답으로 받아 들일 것입니다! 감사 –