Détection de l'orientation du dispositif iOS
je dois détecter quand l'appareil est en orientation portrait pour que je puisse lancer une animation spéciale. Mais je ne veux pas que ma vue soit autorotée.
comment modifier une vue en autorotation lorsque l'appareil est tourné vers portrait? Mon application a seulement besoin d'afficher sa vue dans le paysage, mais il semble que je dois soutenir portrait aussi si je veux être en mesure de détecter une rotation à portrait.
7 réponses
essayez de faire ce qui suit quand l'application charge ou quand votre vue charge:
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter]
addObserver:self selector:@selector(orientationChanged:)
name:UIDeviceOrientationDidChangeNotification
object:[UIDevice currentDevice]];
ajouter la méthode suivante:
- (void) orientationChanged:(NSNotification *)note
{
UIDevice * device = note.object;
switch(device.orientation)
{
case UIDeviceOrientationPortrait:
/* start special animation */
break;
case UIDeviceOrientationPortraitUpsideDown:
/* start special animation */
break;
default:
break;
};
}
ce qui précède vous permettra de vous enregistrer pour des changements d'orientation de l'appareil sans activer l'autorotate de votre vue.
Note
dans tous les cas dans iOS, quand vous ajoutez un observateur, retirez-le aussi aux moments appropriés (éventuellement, mais pas toujours, lorsque la vue apparaît / disparaît). Vous ne pouvez avoir que des "paires" de code observez/unobserve. Si vous ne le faites pas l'application crash. Le choix de l'endroit où observer/retirer la réserve dépasse le cadre de cette assurance de la qualité. Cependant, vous devez avoir une " unobserve "pour correspondre au code" observer " ci-dessus.
si vous êtes venu à cette question en cherchant comment détecter un changement d'orientation (sans nécessairement vouloir désactiver la rotation), vous devriez également être conscient de viewWillTransitionToSize
, disponible auprès de iOS 8.
exemple Swift de ici
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
coordinator.animateAlongsideTransition({ (UIViewControllerTransitionCoordinatorContext) -> Void in
let orient = UIApplication.sharedApplication().statusBarOrientation
switch orient {
case .Portrait:
println("Portrait")
// Do something
default:
println("Anything But Portrait")
// Do something else
}
}, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
println("rotation completed")
})
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
}
et si vous n'avez pas à vous soucier de l'orientation réelle:
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
// do something
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
}
objectif - c exemple de ici
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context)
{
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
// do whatever
} completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
{
}];
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}
et si vous n'avez pas à vous soucier de l'orientation réelle (tiré de cette réponse ):
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
// Do view manipulation here.
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}
Voir aussi
1) Version rapide de la réponse de David 2) dans le cas où vous voulez encore détecter l'orientation quand il n'y a pas de changement d'orientation (lésion rapide de la réponse de Moe à Comment puis-je détecter l'orientation de l'appareil sur iOS? )
// Initial device orientation
let orientation: UIInterfaceOrientation = UIApplication.sharedApplication().statusBarOrientation
if(orientation == UIInterfaceOrientation.Unknown){
// code for Unknown
}
else if(orientation == UIInterfaceOrientation.Portrait){
// code for Portrait
}
else if(orientation == UIInterfaceOrientation.PortraitUpsideDown){
// code for Portrait
}
else if(orientation == UIInterfaceOrientation.LandscapeRight){
// code for Landscape
}
else if(orientation == UIInterfaceOrientation.LandscapeLeft){
// ode for Landscape
}
// To detect device orientation change
UIDevice.currentDevice().beginGeneratingDeviceOrientationNotifications()
NSNotificationCenter.defaultCenter().addObserver(
self,
selector: "orientationChanged:",
name: UIDeviceOrientationDidChangeNotification,
object: UIDevice.currentDevice())
orientationChanged function
func orientationChanged(note: NSNotification)
{
let device: UIDevice = note.object as! UIDevice
switch(device.orientation)
{
case UIDeviceOrientation.Portrait:
// code for Portrait
break
case UIDeviceOrientation.PortraitUpsideDown:
// code for Portrait
break
case UIDeviceOrientation.LandscapeLeft:
// code for Landscape
break
case UIDeviceOrientation.LandscapeRight:
// code for Landscape
break
case UIDeviceOrientation.Unknown:
// code for Unknown
break
default:
break
}
}
Si je vous comprends bien, votre application est paysage. Vous pouvez simplement spécifier dans la configuration des applications qu'il s'agit uniquement de paysage et que vous n'avez donc pas besoin de vous soucier de la rotation. L'application commencera dans landscape et y restera quelle que soit l'orientation de l'iPad.
d'abord désactiver tout sauf l'orientation que vous voulez (de sorte qu'il ne tourne pas)
alors comme David a dit juste obtenir l'orientation actuelle de l'appareil:
alternativement, vous pouvez simplement utiliser l'accéléromètre vous-même (puisque son comment il est fait de toute façon) et de vérifier où la gravité est à voir ce d'orientation. Si vous prenez cette approche, vous pouvez jouer avec les valeurs vous-même pour obtenir des résultats différents.
si vous ne voulez pas créer d'objet périphérique, vous pouvez aussi utiliser
-(void) seObserverForOrientationChanging
{
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter]
addObserver:self selector:@selector(orientationChanged:)
name:UIDeviceOrientationDidChangeNotification
object:[UIDevice currentDevice]];
}
- (void) orientationChanged:(NSNotification *)note
{
if (UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)){
//Do something in landscape
}
else {
//Do something in portrait
}
}
.UIDeviceOrientationDidChange
notification est appelé de nombreuses fois sur iphone, même lorsque l'appareil ne tourne pas. Ne sais pas la raison, mais si vous en avez besoin seulement lorsque l'appareil vraiment tourné, puis faire ce qui suit.
NotificationCenter.default.addObserver(self, selector: #selector(orientationChanged), name: .UIDeviceOrientationDidChange, object: nil)
la méthode appelée de l'observateur devrait ressembler à ceci:
func orientationChanged() {
if traitCollection.isIphone {
defer {
self.previousTraitCollectionForIphone = traitCollection
}
guard let previousTraitCollectionForIphone = previousTraitCollectionForIphone else {
updateView()
return
}
if previousTraitCollectionForIphone != traitCollection {
updateView()
}
} else {
updateView()
}
}