如何使用Apple TV上的焦点引擎使UIImageView可聚焦

时间:2015-12-09 05:34:28

标签: swift tvos apple-tv focus-engine

是否有可能使UIImageView成为焦点?或者我应该只使用UICollectionView来获取所有可能的观点?

我试图覆盖canBecomeFocused,但什么都没发生。

2 个答案:

答案 0 :(得分:1)

我发现最简单的方法是将UIButton子类化为UIImageView(因为UIButton已经有了一个图像子视图)。你可能不需要我放在那里(重要的部分是在layoutSubviews中设置imageView?.adjustsImageWhenAncestorFocused = true)

class AtvImageButton:UIButton
{

   override func awakeFromNib() 
   {
      super.awakeFromNib()      
      contentMode = UIViewContentMode.ScaleAspectFit
      contentHorizontalAlignment = .Fill 
      contentVerticalAlignment   = .Fill     
   }

   override func layoutSubviews() 
   {
      imageView?.adjustsImageWhenAncestorFocused = true
      imageView?.clipsToBounds = false  
      super.layoutSubviews()
   }

   override func canBecomeFocused() -> Bool
   {
      return enabled && super.canBecomeFocused()
   }

}

答案 1 :(得分:0)

尝试将UIImageView包装在容器视图中,使容器视图可聚焦,并使用:

imageView.adjustsImageWhenAncestorFocused = true
imageView.clipsToBounds = false

这应该一次给您几个聚焦效果:

  • 扩大规模
  • 投影
  • 平移时的2D视差
  • 最后但并非最不重要的一点:平移时会有微光效果

如果要改为实现自己的UIImageView焦点效果,则可以执行您所做的操作(重写canBecomeFocused = true),还可以添加:

    override func didUpdateFocus(in context: UIFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) {
        coordinator.addCoordinatedAnimations({
           self.transform = self.isFocused ? CGAffineTransform( scaleX:1.1, y:1.1 ) : .identity
        }, completion: nil)
    }

只知道adjustsImageWhenAncestorFocused选项是全部还是什么都没有。因此,您可以完全按原样采用所有四个系统聚焦效果,也可以完全失去所有这四个聚焦效果,然后自己实施所有聚焦效果。由于无法为所有实际目的重现闪光效果,因此通常最好坚持使用adjustsImageWhenAncestorFocused。