Лучшее является субъективным и зависит от вашего приложения в целом.
Одним из довольно простых способов обработки событий вращения является указание системе не обрабатывать их самостоятельно.Для желаемого эффекта того, что по существу сводится к скольжению (предварительно повернутого) вида со стороны, когда устройство поворачивается в сторону, это может показаться целесообразным.
Вот очень простой пример того, как добиться такого эффекта.
@implementation B_VCRot_ViewController // defined in .h as @interface B_VCRot_ViewController : UIViewController
@synthesize sideways; // defined in .h as @property (strong, nonatomic) IBOutlet UIView *sideways;
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
-(void)orientationChange:(NSNotification *)note{
UIDeviceOrientation newOrientation = [[UIDevice currentDevice] orientation];
CGSize sidewaysSize = self.sideways.frame.size;
if (newOrientation == UIDeviceOrientationLandscapeLeft){
[UIView animateWithDuration:1.0 animations:^{
self.sideways.frame = CGRectMake(0, 0, sidewaysSize.width, sidewaysSize.height);
}];
}
else {
[UIView animateWithDuration:1.0 animations:^{
self.sideways.frame = CGRectMake(self.view.bounds.size.width, 0, sidewaysSize.width, sidewaysSize.height);
}];
}
}
- (void)viewDidLoad{
[super viewDidLoad];
[self.view addSubview:sideways];
self.sideways.transform = CGAffineTransformMakeRotation(M_PI_2); // Rotates the 'sideways' view 90deg to the right.
CGSize sidewaysSize = self.sideways.frame.size;
// Move 'sideways' offscreen to the right to be animated in on rotation.
self.sideways.frame = CGRectMake(self.view.bounds.size.width, 0, sidewaysSize.width, sidewaysSize.height);
// register for rotation notifications
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChange:) name:UIDeviceOrientationDidChangeNotification object:nil];
// Do any additional setup after loading the view, typically from a nib.
}
@end
Здесь я добавил UIView
с альбомной ориентацией в .xib
иподключил его к IBOutlet
с именем sideways
.В viewDidLoad
я добавляю его как подпредставление, предварительно поворачиваю его и перемещаю за пределы экрана.Я также добавляю себя в качестве наблюдателя для уведомлений о ротации устройства (не забудьте удалить себя позже для этого уведомления).А в shouldAutoRo..
я указываю, что этот VC обрабатывает только портрет.
Когда устройство вращается NSNotificationCenter
, звонит orientationChange:
.В этот момент, если устройство повернуть влево, мой sideways
вид будет скользить справа (кажется, что он скользит вниз).
Очевидно, что для обеих альбомных ориентаций код будет более сложным.Также вам, вероятно, придется возиться с синхронизацией анимации, чтобы создать ощущение, что второй вид «падает»