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

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

是否可以使UIImageView聚焦?还是应该仅将UICollectionView用于所有可能的视图?

我尝试覆盖canBecomeFocused,但是什么也没发生。

swift tvos apple-tv focus-engine
2个回答
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()
   }

}

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。

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