Анимация настоящего и увольнение с расширением Share с пользовательским интерфейсом на iOS 8

Я разрабатываю расширение для iOS 8 с пользовательским интерфейсом, но он выглядит без анимации, как я могу это сделать? Это обычный UIViewController.

Кроме того, он отображается в полноэкранном режиме на iPad, и я хочу, чтобы он был модульным контроллером представлений, который появляется в центре экрана и не подходит ему, как я могу это сделать?

С уважением.

Ответ 1

Вот самое чистое решение, которое я нашел до сих пор, чтобы анимировать мой пользовательский контроллер представления и выйти!

Анимация IN:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    self.view.transform = CGAffineTransformMakeTranslation(0, self.view.frame.size.height);
    [UIView animateWithDuration:0.25 animations:^
    {
        self.view.transform = CGAffineTransformIdentity;
    }];
}

Отклонить

- (void)dismiss
{
    [UIView animateWithDuration:0.20 animations:^
    {
        self.view.transform = CGAffineTransformMakeTranslation(0, self.view.frame.size.height);
    } 
    completion:^(BOOL finished) 
    {
        [self.extensionContext completeRequestReturningItems:nil completionHandler:nil];
    }];
}

Ответ 2

Вместо анимации UIViewController view я предлагаю немного другой подход.

Я создал фиктивный UIViewController (называемый PresentingViewController здесь), для которого view.backgroundColor установлено значение [UIColor clearColor]. Затем я представляю предполагаемую пользовательскую UIViewController версию (или пользовательскую анимацию, если хотите) сверху.

Это код для PresentingViewController:

@implementation PresentingViewController

- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];
  [self performSegueWithIdentifier:@"PresentController" sender:self];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
  if ([segue.identifier isEqualToString:@"PresentController"]) {
    CustomViewController *controller = (CustomViewController *)[segue.destinationViewController topViewController];
    controller.context = self.extensionContext;
  }
}

- (IBAction)unwindFromShareVC:(UIStoryboardSegue *)segue {
  [self dismissViewControllerAnimated:YES completion:^{
    NSError *error = [NSError errorWithDomain:@"Cancelled" code:0 userInfo:nil];
    [self.extensionContext cancelRequestWithError:error];
  }];
}

@end

Примечания:

  • extensionContext устанавливается только на PresentingViewController, и поэтому требуется передать его в CustomViewController.
  • Для анимации увольнения я не смог использовать развязку, потому что было сложно узнать о завершении увольнения. Поэтому я использовал dismissViewControllerAnimated:completion:.