在tvOS上显示UITextView的焦点效果?

时间:2016-03-08 17:48:39

标签: ios uikit uitextview tvos focus-engine

当焦点更改为Apple TV上的任何媒体应用程序中的UITextView时 - App Store,电影,电视节目等 - 它会突出显示如下效果:

enter image description here

弹出,出现阴影,拇指在触控板上滚动,使其具有光泽的3D效果。它非常像聚焦的UIButton,或者包含作为聚焦视图的子视图的UIImageView,如UICollectionViewCell。

使用UIButton,如果它是用一种UIButtonType.System初始化的,它会在聚焦时获得聚焦外观,而不需要任何工作。

在焦点视图中使用UIImageView可以设置adjustsImageWhenAncestorFocused,并且在视图聚焦后,它会获得聚焦的外观。

但UITextView和UILabel都不会在被选中时自动设置样式,或者在祖先聚焦时具有调整外观的属性。

所以我想知道我该怎么做。 Apple是否提供任何方式来显示这样的焦点文本视图?

1 个答案:

答案 0 :(得分:0)

据我所知,您正在描述的“光滑3D效果”只能通过使用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效果。我还没有尝试过。