如何设置对tvOS焦点元素的约束

Jan*_*Jan 2 autolayout tvos focus-engine

我有一个UICollectionView在具有图像和字幕文本我tvOS应用程序.我设置了一个约束来固定图像下面的标题文本.

在此输入图像描述

当细胞聚焦并且图像增长时,文本不会移动并停留在图像上方.有没有办法设置一个考虑到聚焦图像大小的约束?

没有焦点的图像

图像与焦点

Mic*_*uba 7

你可以使用一个UIImageView属性focusedFrameGuide.它返回一个UILayoutGuide对象,遗憾的是它无法在Interface Builder中使用,但您可以在代码中使用它创建约束.请注意,此约束仅在视图聚焦时才有意义,因此您必须active根据self.focused属性设置其属性.

首先在视图初始化上创建约束:

self.focusedSpacingConstraint = NSLayoutConstraint(item: imageView.focusedFrameGuide, attribute: .BottomMargin, relatedBy: .Equal, toItem: label, attribute: .Top, multiplier: 1, constant: 0)
//add it to the view and set active to false
Run Code Online (Sandbox Code Playgroud)

然后根据焦点激活此约束或默认约束:

override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) {
    coordinator.addCoordinatedAnimations({
  self.focusedSpacingConstraint.active = self.focused
  self.spacingConstraint.active = !self.focused

  //set label's transform and animate layout changes
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用focusedFrameGuide设置标签的高度(作为图像高度的百分比).

这种方法的优点是,constant无论何时图像大小发生变化,您都不必更改(硬编码).