Переопределить стандартную анимацию UIViewController при повороте устройства - PullRequest
2 голосов
/ 07 февраля 2012

Я хочу предоставить настраиваемую анимацию, когда устройство вращается, полностью переопределяя настройку по умолчанию.Каков наилучший способ добиться этого?

Кстати, планируем анимацию, которую я планирую:

a) Когда устройство переходит в альбомную ориентацию, создайте новый слайд вида сверху, какесли он падает.

b) Когда устройство возвращается в портретное положение, этот вид должен скользить вниз и исчезать.

1 Ответ

1 голос
/ 08 февраля 2012

Лучшее является субъективным и зависит от вашего приложения в целом.

Одним из довольно простых способов обработки событий вращения является указание системе не обрабатывать их самостоятельно.Для желаемого эффекта того, что по существу сводится к скольжению (предварительно повернутого) вида со стороны, когда устройство поворачивается в сторону, это может показаться целесообразным.

Вот очень простой пример того, как добиться такого эффекта.

@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 с именем sidewaysviewDidLoad я добавляю его как подпредставление, предварительно поворачиваю его и перемещаю за пределы экрана.Я также добавляю себя в качестве наблюдателя для уведомлений о ротации устройства (не забудьте удалить себя позже для этого уведомления).А в shouldAutoRo.. я указываю, что этот VC обрабатывает только портрет.

Когда устройство вращается NSNotificationCenter, звонит orientationChange:.В этот момент, если устройство повернуть влево, мой sideways вид будет скользить справа (кажется, что он скользит вниз).

Очевидно, что для обеих альбомных ориентаций код будет более сложным.Также вам, вероятно, придется возиться с синхронизацией анимации, чтобы создать ощущение, что второй вид «падает»

...