2017-09-07 11 views
2

私はボタンで全画面表示できるカスタムビューコントローラを持っています。通常はビューの埋め込みビューです。私の埋め込みからフルスクリーン入力しますこれです:これは私がフルスクリーンのアニメーションを入力のステータスバーを非表示にすることを除いて、正常に動作し、終了でそれを示して完全な画面遷移が途切れてしまう

private func exitFullScreenToEmbed() { 

    let frame = self.view.window?.convert(self.view.frame, to: self.proxyView?.superview) 
    self.proxyView?.superview?.addSubview(self.view) 
    self.view.frame = frame! 

    self.isFullscreen = false 

    UIView.animate(withDuration: 0.25, animations: { 

     self.view.frame = self.proxyView!.frame 

     self.view.layoutIfNeeded() 
     self.setNeedsStatusBarAppearanceUpdate() 
    }) { (_) in 
     self.proxyView?.removeFromSuperview() 
     self.proxyView = nil 
    } 
} 

private func enterFullScreenFromEmbed() { 

    self.proxyView = UIView(frame: self.view.frame) 
    self.proxyView?.isHidden = true 
    self.proxyView?.autoresizingMask = self.view.autoresizingMask 
    self.view.superview?.addSubview(self.proxyView!) 

    // Now set the frame to the screen frame 
    let frame = self.view.window?.convert(self.view.frame, from: self.proxyView?.superview) 
    self.view.window?.addSubview(self.view) 
    self.view.frame = frame! 

    self.isFullscreen = true 

    UIView.animate(withDuration: 0.25) { 
     self.view.frame = self.view.window!.bounds 
     self.view.layoutIfNeeded() 
     self.setNeedsStatusBarAppearanceUpdate() 
    } 
} 

そして、フルスクリーンから出てきます全画面アニメーション。これにより、私のトップビューは、アニメーション化されずに元の位置に戻ります。

isFullscreen変数はステータスバーを隠すものであることに注意してください。

Horizonal

Vertical

お知らせ両方の上部と風景1(景観に見やすい)の下部:

override var prefersStatusBarHidden: Bool { 
    return isFullscreen 
} 

override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { 
    return .slide 
} 

はここでアニメーションのGIFファイルです。上部には、プレーヤーのフレームがすぐに元の位置に設定され、20px(またはステータスバーの高さに関係なく)すべてが下に移動します。

これは、隠しステータスバーと関係しています。誰にも解決策がありますか?

答えて

0

私はそれを理解しました。その一種のハッキーであり、完全にテストされていないが、ここで私が思いついた解決策がある。

まず、ステータスバーの高さ(0ではなく)を保存する変数を取得します。

var statusBarHeight: CGFloat = UIApplication.shared.statusBarFrame.height != 0 ? UIApplication.shared.statusBarFrame.height : 20.0 

次に、ステータスバーのフレーム変更の通知を設定します。

NotificationCenter.default.addObserver(self, selector: #selector(SKPlayerViewController.updateLocalStatusBarFrameHeight), name: .UIApplicationDidChangeStatusBarFrame, object: nil) 

さて、この方法では、高さがステータスバーはありません20(など、通話中の場合)である場合がありますので、我々は、高さを保存しない0の場合にのみ、あなたの変数を更新します。

@objc private func updateLocalStatusBarFrameHeight() { 
     let height = UIApplication.shared.statusBarFrame.height 
     if height > 0 { 
      self.statusBarHeight = height 
     } 
    } 

さて、私はstatusBarHeightで計算フレームの原点を引くために私exitFullScreenToEmbed()を更新だけで風景ではない場合(ステータスバーが風景の中に隠されているため)。

private func exitFullScreenToEmbed() { 

    var frame = self.view.window?.convert(self.view.frame, to: self.proxyView?.superview) 
    self.proxyView?.superview?.addSubview(self.view) 

    if !(UIApplication.shared.statusBarOrientation == .landscapeRight || UIApplication.shared.statusBarOrientation == .landscapeLeft) { 
     frame?.origin.y -= self.statusBarHeight 
    } 

    self.view.frame = frame! 

    self.isFullscreen = false 

    UIView.animate(withDuration: 0.25, animations: { 

     self.view.frame = self.proxyView!.frame 

     self.view.layoutIfNeeded() 
     self.setNeedsStatusBarAppearanceUpdate() 
    }) { (_) in 
     self.proxyView?.removeFromSuperview() 
     self.proxyView = nil 
    } 
} 

これが役に立った場合は、よろしいですか?私はちょうどいくつかの知識を共有するためにここにいる:

関連する問題