Как установить ограничение на элемент, сфокусированный на tvOS

У меня есть UICollectionView в моем приложении tvOS, которое имеет изображение и текст заголовка. Я установил ограничение, чтобы закрепить текст заголовка прямо под изображением.

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

Изображение без фокуса

Изображение с фокусом

3 ответа

Вы можете использовать UIImageView имущество focusedFrameGuide для этого. Возвращает UILayoutGuide объект, который, к сожалению, не может быть использован в Интерфейсном Разработчике, но вы можете создать ограничения с ним в коде. Обратите внимание, что это ограничение имеет смысл только тогда, когда представление сфокусировано, поэтому вы должны установить его active собственность в соответствии с self.focused имущество.

Сначала создайте ограничение на инициализацию представления:

self.focusedSpacingConstraint = NSLayoutConstraint(item: imageView.focusedFrameGuide, attribute: .BottomMargin, relatedBy: .Equal, toItem: label, attribute: .Top, multiplier: 1, constant: 0)
//add it to the view and set active to false

Затем активируйте это ограничение или ограничение по умолчанию в зависимости от фокуса:

override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) {
    coordinator.addCoordinatedAnimations({
  self.focusedSpacingConstraint.active = self.focused
  self.spacingConstraint.active = !self.focused

  //set label's transform and animate layout changes
}

Вы также можете использовать focusedFrameGuide установить высоту надписи (в процентах от высоты изображения).

Преимущество этого подхода в том, что вам не нужно менять (жестко закодированный) constant всякий раз, когда размер изображения изменяется.

Я закончил тем, что установил @IBOutlet к моему ограничению расстояния, и я обновляю его в didUpdateFocusInContext метод. Чтобы добавить некоторый эффект, я также трансформирую метку.

В моей коллекции ячеек:

override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) {
    coordinator.addCoordinatedAnimations({
        if self.focused {
            self.spacingConstraint.constant = 30
            UIView.animateWithDuration(0.3) {
                self.label.transform = CGAffineTransformMakeScale(1.15, 1.15)
                self.layoutIfNeeded()

            }
        }
        else {
            self.spacingConstraint.constant = 0
            UIView.animateWithDuration(0.3) {
                self.label.transform = CGAffineTransformMakeScale(1, 1)
                self.layoutIfNeeded()

            }
        }
        }, completion: nil)
}

Используйте этот код, я надеюсь, он вам поможет. Этот код записать в пользовательский класс ячейки.

override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) {
if (self.focused) {
   self.custom_ImageView.adjustsImageWhenAncestorFocused = true
   self.custom_LabelView1.frame = CGRectMake(0, 279, 548, 29)
}
else {
   self.custom_ImageView.adjustsImageWhenAncestorFocused = false
   self.custom_LabelView1.frame = CGRectMake(0, 259, 548, 29)
}
}
Другие вопросы по тегам