swift 屏幕的翻转 + 状态栏,statusBar的隐藏

1.状态栏的隐藏

这个问题是基于 UIApplication.shared.isStatusBarHidden = true; 调用居然是无效的……

现在写下自己的代码,用来备忘吧……

1.首先需要复写一个 hidden 的这个属性 ,然后调用 setNeedsStatusBarAppearanceUpdate() 方法,

这样使用又觉得麻烦,所以 又多设置了一个变量 ,让使用更简单

  override var prefersStatusBarHidden: Bool {
        return self.isStatusBarHidden
    }
    
    var isStatusBarHidden = false {
        
        didSet{
            self.setNeedsStatusBarAppearanceUpdate()
        }
    }
    

在使用的地方调用

self.isStatusBarHidden = true
//      self.isStatusBarHidden = false;

2.屏幕的翻转:

首先写下试用与 iphone 和 ipad 的

我使用的是transfrone 旋转 视图view ,这样的前提是 这个view 是present 出来的,不能用 navigationController 了

//定义枚举
enum ScreenOrientation :Int {
    
    case portrait = 1;
    case landscape = 2
}

// 定义常量
let scrw = UIScreen.main.bounds.size.width;
let scrh = UIScreen.main.bounds.size.height;


//定义方法
 func tranformView() -> Void {
        
        if self.orientation == .landscape {
            self.orientation = .portrait
        }else{
            self.orientation = .landscape;
        }
       
        if self.orientation == .landscape {
            
            self.isStatusBarHidden = true
            
            UIView.animate(withDuration: deviceChangeOrientationTimeIntravel, animations: {
                
                self.view.transform = CGAffineTransform.init(rotationAngle: CGFloat(Double.pi / 2))
                self.view.bounds = CGRect(x:0,y:0,width:scrh,height:scrw);
                self.viewWillLayoutSubviews();
                self.view.layoutIfNeeded();
            }) { (isFinish) in
           
            }
            
        }else{

            self.isStatusBarHidden = false;
            
            UIView.animate(withDuration: deviceChangeOrientationTimeIntravel, animations: {
                
                self.view.transform = CGAffineTransform.init(rotationAngle: CGFloat(0))
                self.view.bounds = CGRect(x:0,y:0,width:scrw,height:scrh);
                self.viewWillLayoutSubviews();
                self.view.layoutIfNeeded();
                
            }) { (isFinish) in
      
            }
        }
    }

简单易懂,应该是可以使用了……

网上也找了 这个方法,但是使用的时候,只有在iphone 上用,ipad 使用无效

 /*
创建个 extension
使用这个 扩展 要在 appdelegate 文件中 添加代码: var blockRotation: Bool = false */
extension AppDelegate{
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { if self.blockRotation == true{ return UIInterfaceOrientationMask.all; }else{ return UIInterfaceOrientationMask.portrait; } }
}

调用的时候


let appDelegate = UIApplication.shared.delegate as! AppDelegate
//横屏 @objc func hengp()->Void{ appDelegate.blockRotation = true let value = UIInterfaceOrientation.landscapeLeft.rawValue UIDevice.current.setValue(value, forKey: "orientation"); } //竖屏 @objc func shup() -> Void{ appDelegate.blockRotation = false let value = UIInterfaceOrientation.portrait.rawValue UIDevice.current.setValue(value, forKey: "orientation") } //切换横竖屏 执行的代理方法 override func willRotate(to toInterfaceOrientation: UIInterfaceOrientation, duration: TimeInterval) { print("方向即将改变 \(toInterfaceOrientation)"); } override func didRotate(from fromInterfaceOrientation: UIInterfaceOrientation) { print("方向改变完成 ");
/* 在这里更新 约束 和 frame */
UIView.animate(withDuration: deviceChangeOrientationTimeIntravel, animations: { self.viewWillLayoutSubviews(); self.view.layoutIfNeeded(); }) { (isFinish) in if isFinish == true{ } } }