36 votes

Comment faire pivoter les sous-vues autour de leurs propres centres?

Est-il possible de faire pivoter une vue autour de son propre centre?

Dans mon implémentation actuelle, les sous-vues (boutons, etc.) semblent suivre une trajectoire amusante avant de se retrouver dans les positions souhaitées (car le système de coordonnées de la super-vue est pivoté). Je voudrais que les vues tournent à 90 degrés autour de leurs propres centres, comme dans l'image ci-dessous.

rotation souhaitée

16voto

NJones Points 20265

J'aime vraiment cette question. Je trouve aussi que la rotation de l'animation choquante pour certaines interfaces. Voici comment je voudrais mettre en œuvre ce que vous avez photographié. Un simple @interface sera très bien. Note: je suis à l'aide de l'ARC.

#import <UIKit/UIKit.h>
@interface ControllerWithRotatingButtons : UIViewController
@property (strong, nonatomic) IBOutlet UIButton *buttonA;
@property (strong, nonatomic) IBOutlet UIButton *buttonB;
@property (strong, nonatomic) IBOutlet UIButton *buttonC;
@end

La prise appropriée, les connexions sont faites pour les boutons dans l' .xib:

enter image description here

ControllerWithRotatingButtons.m:

#import "ControllerWithRotatingButtons.h"
@implementation ControllerWithRotatingButtons
@synthesize buttonA = _buttonA;
@synthesize buttonB = _buttonB;
@synthesize buttonC = _buttonC;
-(void)deviceRotated:(NSNotification *)note{
    UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
    CGFloat rotationAngle = 0;
    if (orientation == UIDeviceOrientationPortraitUpsideDown) rotationAngle = M_PI;
    else if (orientation == UIDeviceOrientationLandscapeLeft) rotationAngle = M_PI_2;
    else if (orientation == UIDeviceOrientationLandscapeRight) rotationAngle = -M_PI_2;
    [UIView animateWithDuration:0.5 animations:^{
        _buttonA.transform = CGAffineTransformMakeRotation(rotationAngle);
        _buttonB.transform = CGAffineTransformMakeRotation(rotationAngle);
        _buttonC.transform = CGAffineTransformMakeRotation(rotationAngle);
    } completion:nil];
}
-(void)viewDidLoad{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceRotated:) name:UIDeviceOrientationDidChangeNotification object:nil];
}
-(void)viewDidUnload{
    [super viewDidUnload];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];
}
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
@end

Et c'est tout. Maintenant, lorsque vous faites pivoter votre appareil, l'écran ne tourne pas, mais les boutons comme indiqué:

enter image description here

Bien sûr, si vous voulez que le bouton d'étiquettes pour vous serait tout simplement d'appliquer la transformation à l' _buttonA.titleLabel à la place.

Remarque: Veuillez noter qu'une fois que l'appareil est tourné en ce qui concerne les touche pas sur les boutons, l'appareil est toujours en mode portrait, mais votre réponse à mon commentaire semble indiquer qu'il n'est pas un problème pour vous.

N'hésitez pas à laisser un commentaire si vous avez une question connexe.

4voto

Cyprian Points 7158

Vous pouvez faire pivoter manuellement n'importe quelle sous-classe UIView à l'aide de la propriété de transformation.

 #import <QuartzCore/QuartzCore.h>

myView.transform = CGAffineTransformMakeRotation(M_PI/2);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X