Как добавить переход к viewWillTransitionToSize - PullRequest
0 голосов
/ 03 июля 2018

Я работаю в Objective-C для iPhone и iPad, в настоящее время на iOS11 и не использую Interface Builder.

Я использую viewWillTransitionToSize для обработки поворотов моего устройства.

Я хочу, чтобы пользовательский интерфейс, который начинается, когда вращение начиналось, переходил в черный цвет, и, когда вновь повернутый пользовательский интерфейс стабилен, я хочу, чтобы новый пользовательский интерфейс снова появлялся. Общее исчезновение / постепенное исчезновение время перехода должно быть около 1/2 секунды.

Я видел дискуссии о том, что переходы можно интегрировать с viewWillTransitionToSize, но я не видел примеров, и я борюсь с тем, как сделать то, что я хочу.

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

- (void)  viewWillTransitionToSize: (CGSize) size
         withTransitionCoordinator: (id)     cord
   {
   [super viewWillTransitionToSize: size withTransitionCoordinator: cord];

   void (^midRotationBlk)(id) = ^(id cntx)
      {
      [gU updDevDirOrient: size];
      [self calcScrnCntAndScrollSize]; // recalculates horz scroll size
      [self updateViewConstraints];
      [[[self view] layer] addAnimation: [gU getTransitionEaseInOut: 0.5f]
                                 forKey: nil];
      };

   void (^endRotationBlk)(id) = ^(id cntx)
      {
      [self doScrollToPage: [self prevScrollPage]];
      };

   [cord animateAlongsideTransition: midRotationBlk
                         completion: endRotationBlk];
   }

Вызов getTransitionEaseInOut выглядит следующим образом:

- (CATransition *) getTransitionEaseInOut: (float) secs;
   {
   CATransition * transition = [CATransition animation];

   [transition       setDuration: secs];
   [transition setTimingFunction: [CAMediaTimingFunction
                functionWithName: kCAMediaTimingFunctionEaseInEaseOut]];
   [transition           setType: kCATransitionFade];

   return( transition );
   }

Я экспериментировал с тем, где я помещаю вызов addAnimation в процедуру viewWillTransitionToSize, но ни одна из позиций, которые я пробовал, действительно не помогает. У меня такое чувство, что я все делаю неправильно.

1 Ответ

0 голосов
/ 10 июля 2018

Я решил это после небольшого количества экспериментов.

В каждом из моих контроллеров представления я добавил дополнительный UIView. Он рассчитан на весь физический экран. Это всегда последний добавленный вид, поэтому он охватывает все остальные детали под ним. Его цвет устанавливается таким же цветом, как и существующий цвет фона контроллера представления. Я обращаюсь к этому представлению как к «ovrView» в коде ниже.

При входе в контроллер представления в viewWillAppear я добавил следующий код:

   ovrView.alpha = 1.0f;
   [UIView animateWithDuration: 0.2f
                    animations: ^{ ovrView.alpha = 0.0f; }];

Это приводит к тому, что каждый раз, когда я вхожу в контроллер представления, пользователю дается пустое фоновое цветное поле, и это наложение исчезает через 0,2 секунды, раскрывая детали ниже.

В каждой процедуре viewWillTransitionToSize каждого контроллера я добавил следующий код:

- (void)  viewWillTransitionToSize: (CGSize) newSize
         withTransitionCoordinator: (id)     coordinator
   {
   //...this code executes before the rotation.

   [super  viewWillTransitionToSize: newSize 
          withTransitionCoordinator: coordinator];

   ovrView.alpha = 1.0f;

   void (^midRotationBlk)(id) = ^(id context)
      {
      //...this code executes during the rotation.

      [self updateViewConstraints];
      };

   void (^endRotationBlk)(id) = ^(id context)
      {
      //...this code executes after the rotation.

       [UIView animateWithDuration: 0.4f
                       animations: ^{ ovrView.alpha = 0.0f; }];
     };

   [coordinator animateAlongsideTransition: midRotationBlk
                                completion: endRotationBlk];
   }

Этот код приводит к тому, что экран переходит на пустой фоновый цвет непосредственно перед началом вращения, а затем очищается, чтобы показать детали после поворота сразу после окончания вращения.

Я попытался добавить в ovrView постепенное увеличение, поскольку вращение началось, вместо того, чтобы сразу установить альфа в 1.0f. Но я всегда мог видеть вращение, начинающееся при появлении анимированной анимации, поэтому я отказался от него.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...