Child View Controller to Rotate While Parent View Controller Does Not

前端 未结 3 1713
既然无缘
既然无缘 2020-12-12 21:21

What I am Trying to Do:

Parent View that is managed by Parent View Controller SHOULD NOT ROTATE.

Child View that i

3条回答
  •  再見小時候
    2020-12-12 21:53

    After many back and forth's with Apple them selves, and them pointing to the same link Technical Q&A QA1890, I had to do this with the flowing way:

    MotherViewController

    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    
            super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
    
            coordinator.animateAlongsideTransition({(context: UIViewControllerTransitionCoordinatorContext) -> Void in
                let deltaTransform: CGAffineTransform = coordinator.targetTransform()
                let deltaAngle: CGFloat = atan2(deltaTransform.b, deltaTransform.a)
                var currentRotation: CGFloat = self.mainView.layer.valueForKeyPath("transform.rotation.z") as! CGFloat
    
                // Adding a small value to the rotation angle forces the animation to occur in a the desired direction, preventing an issue where the view would appear to rotate 2PI radians during a rotation from LandscapeRight -> LandscapeLeft.
                currentRotation += -1 * deltaAngle + 0.0001
                self.mainView.layer.setValue(currentRotation, forKeyPath: "transform.rotation.z")
    
                }, completion: {(
                    context: UIViewControllerTransitionCoordinatorContext) -> Void in
                    // Integralize the transform to undo the extra 0.0001 added to the rotation angle.
                    var currentTransform: CGAffineTransform = self.mainView.transform
                    currentTransform.a = round(currentTransform.a)
                    currentTransform.b = round(currentTransform.b)
                    currentTransform.c = round(currentTransform.c)
                    currentTransform.d = round(currentTransform.d)
                    self.mainView.transform = currentTransform
            })
        }
    

    MainViewController

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "orientationChanged:", name:UIDeviceOrientationDidChangeNotification, object: nil)
    
    func orientationChanged ( notification: NSNotification){
            switch UIDevice.currentDevice().orientation {
            case .Portrait:
                self.rotateChildViewsForOrientation(0)
            case .PortraitUpsideDown:
                self.rotateChildViewsForOrientation(0)
            case .LandscapeLeft:
                self.rotateChildViewsForOrientation(90)
            case .LandscapeRight:
                self.rotateChildViewsForOrientation(-90)
            default:
                print ("Default")
                    }
        }
    

    This seem to rotate the child view's while keeping the main view static. Also the app seem to know the proper orientation when notifications come in (because mother view actually rotates behind the scenes).

    Special thanks to jamesk and Warif Akhand Rishi for all the help!

提交回复
热议问题