TVOS настраивает изображение при AncestorFocused Size

Можно ли настроить размер / кадр ImageView, когда фокусируется с помощью imgView.adjustsImageWhenAncestorFocused = true?

Обыскивает сети, но не может найти ничего, что установило бы масштабирование эффекта, кажется, просто какое-то значение по умолчанию.

1 ответ

Решение

Кажется, ты не можешь этого сделать. И я думаю, что Apple не позволяет делать это по причине.

Для TVOS есть очень подробные рекомендации по интерфейсу пользователя. Они рекомендуют интервал и размер элемента для разметки сетки с различным количеством столбцов, чтобы обеспечить оптимальное качество просмотра:

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

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

Таким образом, вы не можете изменить кадр UIImageView, но вы можете получить к нему косвенный доступ - используя focusedFrameGuide собственность

Вы можете настроить размер через imgView.transform. Если ваш imgView внутри другого представления (например, внутриUICollectionViewCell) вы можете использовать приведенный ниже код, чтобы уменьшить изображение на 10% при получении фокуса.

override func didUpdateFocus(in context: UIFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) {
    super.didUpdateFocus(in: context, with: coordinator)
    if context.nextFocusedView === self {
        coordinator.addCoordinatedAnimations({
            self.imgView.transform = self.transform.scaledBy(x: 0.9, y: 0.9)
        }, completion: nil)
    }
    if context.previouslyFocusedView === self {
        coordinator.addCoordinatedAnimations({
            self.imgView.transform = .identity
        }, completion: nil)
    }
}

Также вы можете рассчитать шкалу фокусировки системы для UIImageView с участием adjustsImageWhenAncestorFocused = true со следующим кодом:

let xScale = imgView.focusedFrameGuide.layoutFrame.size.width / imgView.frame.size.width 
let yScale = imgView.focusedFrameGuide.layoutFrame.size.height / imgView.frame.size.height 

Если вы хотите убрать окалину при фокусировке на UIImageView с участием adjustsImageWhenAncestorFocused = true использование:

override func didUpdateFocus(in context: UIFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) {
    super.didUpdateFocus(in: context, with: coordinator)
    let xScale = imgView.focusedFrameGuide.layoutFrame.size.width / imgView.frame.size.width 
    let yScale = imgView.focusedFrameGuide.layoutFrame.size.height / imgView.frame.size.height 
    if context.nextFocusedView === self {
        coordinator.addCoordinatedAnimations({
            self.imgView.transform = self.transform.scaledBy(x: 1 / xScale, y: 1 / yScale)
        }, completion: nil)
    }
    if context.previouslyFocusedView === self {
        coordinator.addCoordinatedAnimations({
            self.imgView.transform = .identity
        }, completion: nil)
    }
}

PS Не забудьте установить clipsToBounds = false на UIImageView

Другие вопросы по тегам