2017-09-08 2 views
0

Ich möchte Controller wie YouTube implementieren. Der obere Teil des Controllers spielt Video und der untere Teil bleibt statisch. Und wenn der Benutzer das Gerät dreht, wird nur Top rotiert.Wie man Video-Controller wie YouTube mit Rotation zu Landschaft implementieren

Ich versuchte es mit diesem Code zu implementieren:

@IBOutlet weak var myView: UIView! 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 
     NotificationCenter.default.addObserver(self, selector: #selector(self.rotated), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil) 
    } 

    @objc func rotated() { 
     if UIDeviceOrientationIsLandscape(UIDevice.current.orientation) { 
      UIView.animate(withDuration: 0.9, animations: { 
       self.myView.transform = CGAffineTransform(rotationAngle: CGFloat.pi/2) 
       let rect = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height) 
       self.myView.frame = rect 
      }) 
     } 
    } 

Und ich habe dieses Ergebnis:

enter image description here

Problem ist Controller noch im Hochformat und Statusleiste am falschen Seite.

Ich denke, dass es für diese Sache eine bessere Umsetzung gibt.

Bitte helfen

Antwort

1

Dies ist eine einfache Lösung für Ihr Problem ist,

import UIKit 

class ViewController: UIViewController { 

    let RotatingView :UIView = UIView() 
    let TextLabel :UILabel = UILabel() 

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


     self.RotatingView.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: (self.view.frame.size.height/3)) 
     self.RotatingView.backgroundColor = UIColor.black 



     self.TextLabel.text = "Rotating View" 
     self.TextLabel.textColor = UIColor.white 
     self.TextLabel.textAlignment = .center 
     self.TextLabel.frame = CGRect(x: 0, y: self.RotatingView.frame.size.height/2, width: self.RotatingView.frame.width, height: 20) 

     self.RotatingView.addSubview(self.TextLabel) 
     self.view.addSubview(self.RotatingView) 

     NotificationCenter.default.addObserver(self, selector: #selector(rotated), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil) 


    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func rotated(){ 
     switch UIDevice.current.orientation { 
     case .landscapeLeft, .landscapeRight: 
      self.RotatingView.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: (self.view.frame.size.height)) 
      self.TextLabel.frame = CGRect(x: 0, y: self.RotatingView.frame.size.height/2, width: self.RotatingView.frame.width, height: 20) 
     default: 
      self.RotatingView.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: (self.view.frame.size.height/3)) 
      self.TextLabel.frame = CGRect(x: 0, y: self.RotatingView.frame.size.height/2, width: self.RotatingView.frame.width, height: 20) 
     } 
    } 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(true) 
     self.setNeedsStatusBarAppearanceUpdate() 
    } 

    override var prefersStatusBarHidden : Bool { 
     return false 
    } 


} 
+0

Danke für die Antwort! Aber diese Lösung dreht alle Ansichten in der Steuerung. Ich muss nur die Ansicht des Players drehen, wie auf meinem gif –

+0

@SergeiR gezeigt. Es ist möglich, alle anderen Ansichten unverändert zu lassen und dann nur eine Ansicht zu drehen. Aber dann können Sie die Statusleiste nicht reparieren. Es wird im Porträt bleiben. Sie können es nicht vom Code ändern. Mein Vorschlag ist, die Statusleiste im Querformat zu verstecken. Das tut Youtube. Wenn Sie damit einverstanden sind, kann ich den Code aktualisieren. – Bishan

Verwandte Themen