Показать эффекты фокуса для UITextView на TVOS?
Когда фокус изменяется на UITextView в любом из мультимедийных приложений на Apple TV - App Store, Фильмах, ТВ-шоу и т. Д. - он выделяется с эффектом, который выглядит следующим образом:
Он выскакивает, появляется тень, и при движении пальца по трекпаду появляется глянцевый эффект 3D. Это очень похоже на сфокусированный UIButton или UIImageView, содержащийся в качестве подпредставления сфокусированного представления, например UICollectionViewCell.
С UIButton, если он инициализируется с типом UIButtonType.System, он получает сфокусированный вид, когда сфокусирован, без какой-либо работы.
С помощью UIImageView в сфокусированном виде можно установить adjustsImageWhenAncestorFocused
и когда взгляд становится сфокусированным, он приобретает сфокусированный вид.
Но ни UITextView, ни UILabel автоматически не стилизуются при выборе или не имеют свойства для настройки внешнего вида, когда фокусируется предок.
Поэтому мне интересно, как мне это сделать. Предоставляет ли Apple какой-либо способ отображения сфокусированного текстового представления, подобного этому?
0 ответов
Насколько мне известно, "глянцевый трехмерный эффект", который вы описываете, доступен только при использовании UIImageView.adjustsImageWhenAncestorIsFocused. И воссоздать себя практически невозможно.
Исходя из этого, я бы предположил, что эффект достигается за счет наложения вида с копией UIImage самого себя при фокусировке. Или у Apple есть доступ к низкоуровневому API для глянцевого 3D-эффекта, к которому вы и я не можем получить доступ.
Итак, попробуйте что-нибудь вроде:
class CustomTextView:
override func didUpdateFocus(in context: UIFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) {
if (isFocused){
if (self.imageOverlay != nil) {
let imageView: UIImageView = self.toImageView() // many ways to achieve this. Ex: see UIGraphicsBeginImageContext()
imageView.frame = bounds
imageView.adjustsImageWhenAncestorIsFocused = true
imageView.clipsToBounds = false
self.imageOverlay = imageView
addSubview(imageView)
}
}
else{
coordinator.addCoordinatedAnimations(... completion:{
if (!self.isFocused){
self.imageOverlay.removeFromSuperview()
self.imageOverlay = nil
}
})
}
super.didUpdateFocus( in:context, with:coordinator )
}
Эффект UIImageView.adjustsImageWhenAncestorIsFocused также включает масштабирование, тень и обратную связь / параллакс при панорамировании. Они не являются ни съемными, ни настраиваемыми.
В качестве альтернативы попробуйте поиграть с различными видами блокировки в TVUIKit. Может быть, в один или несколько из них также встроен глянцевый 3D-эффект. Я с ними еще не экспериментировал.