如何为自定义视图设置canBecomeFocused

时间:2015-09-24 04:01:00

标签: objective-c uiview apple-tv tvos

我正在为tvOS申请。我的视图包含UIButton和自定义UIView,其中包含其他一些自定义视图。模拟器只能突出显示UIButton,而不能突出显示自定义视图。

根据Building Apple TV Apps Docs

  

如果您的自定义视图需要具有焦点,请覆盖canBecomeFocused以返回YES(默认情况下,它返回NO)。

根据canBecomeFocused Docs

canBecomeFocused将返回

  

如果视图可以聚焦,则为YES;否则没有。

然而,尝试通过这样做为canBecomeFocus分配YES:

self.customView.canBecomeFocused = YES;

给出了这个错误:

No setter method 'setCanBecomeFocused:' for assignment to property

我如何做到这一点?

3 个答案:

答案 0 :(得分:5)

看起来UIView声明了函数/属性。

您是否尝试过覆盖这样的功能?

夫特

override func canBecomeFocused() -> Bool {
    return true
}

目标C

- (BOOL)canBecomeFocused {
    return YES;
}

我没试过这个,但它可能适合你。

答案 1 :(得分:2)

除了覆盖自定义视图中的canBecomeFocused方法:

override func canBecomeFocused() -> Bool {
    return true
}

确保自定义视图userInteractionEnabled为真。这是完整的列表,以确保您的视图可以集中:

  

为什么这种观点不可聚焦?

     

预计可以关注的视图有多种原因可能不是,包括(但不限于):

     
      
  • 视图的canBecomeFocused方法返回NO。
  •   
  • 视图已隐藏   property的值为YES。
  •   
  • 视图的alpha属性值为0.
  •   
  • 视图的用户互动已停用。
  •   
  • 视图被另一个视图遮挡。
  •   

答案 2 :(得分:0)

以上答案仅限于我的customView代码块。

夫特

import UIKit

class Focus: UIView {

    /*
    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func drawRect(rect: CGRect) {
        // Drawing code
    }
    */

    override func canBecomeFocused() -> Bool {
        return true
    }

    override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) {
        if context.previouslyFocusedView === self {
            UIView.animateWithDuration(0.1, animations: { () -> Void in
                context.previouslyFocusedView?.transform = CGAffineTransformMakeScale(1.0, 1.0)
            })
        }

        if context.nextFocusedView === self {
            UIView.animateWithDuration(0.1, animations: { () -> Void in
                context.nextFocusedView?.transform = CGAffineTransformMakeScale(1.4, 1.4)
            })
        }
    }
}