Как вращать подвиды вокруг своих центров? - PullRequest
36 голосов
/ 08 января 2012

Возможно ли повернуть вид вокруг своего собственного центра?

В моей нынешней реализации подсвечники (кнопки и т. Д.), Кажется, движутся по забавной траектории, прежде чем они окажутся в нужных позициях (так как система координат супер-вида вращается).Я бы хотел, чтобы виды вращались вокруг своих центров на 90 градусов, как показано на рисунке ниже.

desired rotation

Ответы [ 2 ]

16 голосов
/ 10 января 2012

Мне очень нравится этот вопрос.Я также нахожу раздражение анимации вращения для некоторых интерфейсов.Вот как я бы реализовал то, что вы изобразили.Простое @interface будет просто отлично. Примечание: Я использую 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

Соответствующие розетки подключены к кнопкам в .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

И все.Теперь, когда вы поворачиваете свое устройство, экран не будет вращаться, но кнопки будут выглядеть так:

enter image description here

Конечно, если вы хотите, чтобы только метки кнопки поворачивались, вы просто применили бы преобразование.вместо _buttonA.titleLabel.

Примечание: Обратите внимание, что после поворота устройства до точки касания, не относящейся к кнопкам, устройство остается в портретном положении, но ваш ответмой комментарий, кажется, указывает, что это не проблема для вас.

Не стесняйтесь оставлять комментарии, если у вас есть связанный вопрос.

4 голосов
/ 08 января 2012

Вы можете вручную вращать любой подкласс UIView, используя свойство transform.

#import <QuartzCore/QuartzCore.h>

myView.transform = CGAffineTransformMakeRotation(M_PI/2);
...