2012-01-08 2 views
36

Можно ли поворачивать представление вокруг своего собственного центра?Как поворачивать подвидки вокруг своих собственных центров?

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

desired rotation

+21

+1 для хорошо иллюстрированного вопроса – Till

+0

Вы хотите, чтобы строка состояния оставалась неподвижной, или это просто пропущено на иллюстрации? – NJones

+0

@NJones Пока это не моя главная цель, было бы хорошо, если бы оно оставалось неподвижным! В моей нынешней реализации субвизоры движутся по «смешному пути», потому что супер-просмотр (или корневое окно?) Вращается. – ragnarius

ответ

16

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

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

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

+0

Спасибо большое! Код элегантен, а подзоны теперь перемещаются так гладко! – ragnarius

+0

Молодцы! Очень эффективный ! – Nil

4

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

#import <QuartzCore/QuartzCore.h> 

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

Это выглядит просто! Но почему-то я должен предотвратить поворот основного вида и выяснить, где разместить фрагмент кода. – ragnarius

+0

Вы должны заглянуть в обратные вызовы вращения UIViewController, такие как '- shouldAutorotateToInterfaceOrientation:' и '- willRotateToInterfaceOrientation: duration:'. Посмотрите, можете ли вы сохранить просмотр с вращением, но все же подписаться на события поворота и соответствующим образом изменить свои подсмотры. –

Смежные вопросы