2016-08-22 7 views
1

Xcode 8 бета 6, tvOS Beta 6оживляющий подслой при изменении фокуса

У меня есть приложение tvOS, где я хочу, чтобы оживить фон элемента управления, когда он получает или теряет фокус. Я установил элемент управления для «Настраиваемого» фокуса и реализовал didUpdateFocusInContext:withAnimationCoordinator: на элементе управления. Вот код:

-(void)didUpdateFocusInContext:(UIFocusUpdateContext *)context 
    withAnimationCoordinator:(UIFocusAnimationCoordinator *)coordinator { 

    // Create the layer if we don't have it. 
    if (!self->_focusLayer) { 
    // ... Create a new CALayer and store it in _focusLayer 
    } 

    // Animate in or out. 
    if (context.nextFocusedView == self) { 

     if (! self->_focusLayer.superlayer) { 
      STLog(self, @"Adding focus"); 
      self->_focusLayer.opacity = 0.0f; 
      [self.layer addSublayer:self->_focusLayer]; 
      [coordinator addCoordinatedAnimations:^{ 
       self->_focusLayer.opacity = 1.0f; 
      } 
             completion:NULL]; 
     } 

    } else { 

     if (self->_focusLayer.superlayer) { 
      STLog(self, @"Removing focus"); 
      [coordinator addCoordinatedAnimations:^{ 
       self->_focusLayer.opacity = 0.0f; 
      } 
             completion:^{ 
              [self->_focusLayer removeFromSuperlayer]; 
             }]; 
     } 
    } 
} 

Все работает, кроме анимации непрозрачности подслоя. Я искал сеть, и все приведенные мной примеры указывают на то, что это должно сработать. Я также пытался переключиться на использование CABasicAnimation без везения.

Кто-нибудь знает, почему это не работает?

ответ

1

Координатор фокуса не является самим блоком анимации. Он просто координирует различные анимации одновременно. Поскольку изменение непрозрачности не является самой анимацией, вам нужно сделать свою непрозрачность или альфа-изменения в блоке анимации UIView, чтобы сделать ее анимацией, которую вы добавляете к координатору.

Попробуйте это:

-(void)didUpdateFocusInContext:(UIFocusUpdateContext *)context 
     withAnimationCoordinator:(UIFocusAnimationCoordinator *)coordinator { 

    // Create the layer if we don't have it. 
    if (!self->_focusLayer) { 
     // ... Create a new CALayer and store it in _focusLayer 
    } 

    // Animate in or out. 
    if (context.nextFocusedView == self) { 

     if (! self->_focusLayer.superlayer) { 
      STLog(self, @"Adding focus"); 
      self->_focusLayer.opacity = 0.0f; 
      [self.layer addSublayer:self->_focusLayer]; 
      [coordinator addCoordinatedAnimations:^{ 

       [UIView animateWithDuration: 0.4 animations:^{ 
        self->_focusLayer.opacity = 1.0f; 
       } completion:NULL]; 

      } completion:NULL]; 
     } 

    } else { 

     if (self->_focusLayer.superlayer) { 
      STLog(self, @"Removing focus"); 
      [coordinator addCoordinatedAnimations:^{ 

       [UIView animateWithDuration:0.4 animations:^{ 
        self->_focusLayer.opacity = 0.0f; 
       } completion:NULL]; 

      } completion:^{ 
       [self->_focusLayer removeFromSuperlayer]; 
      }]; 
     } 
    } 
} 

Пожалуйста, обратите внимание, что приведенный выше код набран здесь и не тестируется в проекте.

отметить также, что продолжительность анимации игнорируются координатором анимации и продолжительность фокус анимации по умолчанию используется, если не установлен параметр анимации для переопределения унаследованных длительности использования:

options:UIViewAnimationOptionOverrideInheritedDuration 

Подробнее об управлении фокусировкой анимацией координатор здесь:

https://developer.apple.com/reference/uikit/uifocusanimationcoordinator

+0

Спасибо. Я займусь этим. – drekka