-1
votes

Éviter la rotation d'une vue dans la vue Contentroller avec un changement d'orientation

J'ai besoin d'éviter la rotation de la vue unique à l'intérieur du ViewController lorsque l'orientation change. Lorsque l'utilisateur modifie l'orientation de la vue de périphériqueController doit être pivotée mais une vue à l'intérieur de ce ViewController doit être conservé comme itis. Y a-t-il un moyen d'atteindre cette tâche. J'ai vu de nombreuses applications utiliser cette technique mais n'avez pas l'idée de le faire.

comme Adobe Draw app


0 commentaires

3 Réponses :


0
votes

Vous devez définir l'orientation de l'appareil. Vous voudrez peut-être utiliser le FUNC ci-dessous pour définir l'orientation.

lockOrientation(UIInterfaceOrientationMask.portrait, andRotateTo: UIInterfaceOrientation.portrait)


0 commentaires

0
votes

J'ai trouvé la solution pour ma question ci-dessus et je l'énonce ici car cela peut être utile pour quelqu'un.

Si vous avez besoin de garder la position comme ITA de particulier code> code> à l'intérieur du ViewController Code> Lorsque vous modifiez l'orientation du périphérique, nous devons faire pivoter cette vue dans la direction inverse à la même vitesse. Dans iPads La durée de rotation est 0,4s code> et dans iPhones, il faudra 0.3s code> p>

exemple de code: p>

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {

    var timeDuration: TimeInterval = 0.4 //for iPads
    if DeviceHardware.deviceIsPhone() {
        timeDuration = 0.3 //for iPhones
    }

    if UIDevice.current.orientation.isLandscape {

        if UIDevice.current.orientation == .landscapeLeft{
            UIView.animate(withDuration: timeDuration, animations: {
                let degrees : Double = 0; //the value in degrees
                self.relevantView!.transform = CGAffineTransform(rotationAngle: CGFloat(degrees * .pi/180))

            })
        }else{
            UIView.animate(withDuration: timeDuration, animations: {
                let degrees : Double = 180; //the value in degrees
                self.relevantView!.transform = CGAffineTransform(rotationAngle: CGFloat(degrees * .pi/180))

            })
        }

    } else {

        if UIDevice.current.orientation == .portraitUpsideDown{
            UIView.animate(withDuration: timeDuration, animations: {
                let degrees : Double = -90; //the value in degrees
                self.relevantView!.transform = CGAffineTransform(rotationAngle: CGFloat(degrees * .pi/180))

            })
        }else{
            UIView.animate(withDuration: timeDuration, animations: {
                let degrees : Double = 90; //the value in degrees
                self.relevantView!.transform = CGAffineTransform(rotationAngle: CGFloat(degrees * .pi/180))

            })
        }
    }
}


1 commentaires

J'ai fait publier une solution mise à jour qui semble plus robuste en concaturant une transformation inverse du système. De cette façon, vous n'avez pas à traiter de la durée statique concernant l'appareil.



0
votes

Il vous suffit d'appliquer une rotation d'animation inversée à vos vues pour annuler la rotation du système:

Remplacement de la vue FuncWillTransition (à la taille: CGSIZE, avec coordinateur: UIViewControllerTransitioncoordinator) { P>

coordinator.animate(alongsideTransition: { (context) in
    
    self.nonRotatingView!.transform = self.nonRotatingView!.transform.concatenating(context.targetTransform.inverted())
    
    
}) { (context) in
 
    // Something to do on completion ?
    
}


0 commentaires