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