J'ai besoin d'éviter la rotation de la vue unique à l'intérieur du comme Adobe Draw app P> ViewController code> 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 code> 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. P>
3 Réponses :
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)
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 exemple de code: p> 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>
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))
})
}
}
}
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.
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 ? }