Лучшее субъективно и зависит от вашего приложения в целом.
Один довольно прямой способ обработки событий поворота говорит системе, чтобы они не обрабатывали их самостоятельно. Для вашего желаемого эффекта от того, что по существу сводится к скольжению (предварительно повернутому) виду со стороны, когда устройство повернуто сбоку, это, по-видимому, подходит.
Вот очень простой пример того, как достичь такого эффекта.
@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
будет скользить справа (похоже, оно скользит вниз).
Очевидно, что для обеих ориентаций ландшафта код будет более сложным. Также вам, скорее всего, придется возиться с временем анимации, чтобы почувствовать, что второй вид «падает»