2

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

Кстати, вид анимации я планирую это:

а) Когда устройство переходит в ландшафт, есть новый вид слайд сверху, как будто это было падение.

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

ответ

1

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

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

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

@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 будет скользить справа (похоже, оно скользит вниз).

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