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

问题描述 投票:2回答:1

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

enter image description here

它弹出,出现阴影,并且在触控板上滚动拇指可以使它具有光泽的3D效果。它很像一个焦点化的UIButton,或者一个UIImageView包含在焦点化视图的子视图中,例如UICollectionViewCell。

使用UIButton,如果使用UIButtonType.System类型初始化,则在聚焦时无需任何工作即可获得聚焦外观。

在具有聚焦视图的UIImageView中可以设置adjustsImageWhenAncestorFocused,并且在该视图变为聚焦后,它将获得聚焦的外观。

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

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

ios uikit uitextview tvos focus-engine
1个回答
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效果。我还没有尝试过。

© www.soinside.com 2019 - 2024. All rights reserved.