ker*_*nic 6 focus uilabel tvos
我正在尝试实现6行高描述标签,我希望它可以集中精力.理想情况下,这意味着扩展UILabel类以创建自定义组件.我想,通过实施canBecomeFocused和didUpdateFocusInContext,但我的UILabel似乎并没有得到任何的焦点.
我也尝试用UIButton替换UILabel,但按钮并没有真正针对这类事情进行优化.这也意味着我需要将buttonType焦点从自定义更改为普通..而buttonType似乎是一个只有就绪的属性.
实际上,我想在Apple TV Movies应用程序中使用Apple实现完全相同的文本标签.对于电影描述,他们有一个文本标签,显示几行文字和"更多".聚焦时,它看起来像一个按钮(阴影周围)和改变背景颜色.点击时 - 它会打开一个包含整个电影描述的模态窗口.
有什么建议?或者有人已经为tvOS实现了这个自定义控件?或者更好的事件 - 苹果有一个组件可以做到这一点,我错过了一些东西.
PS:欢迎Swift解决方案:)
好的,回答我自己的问题:)
所以看起来有些观点在tvOS上是"可以集中"开箱即用的,而其他观点必须得到指示.
我终于结束了使用UITextView,它有一个selectable属性,但如果不是默认情况下这些可聚焦视图之一.TextView必须禁用编辑才能使其看起来像UILabel.此外,目前有一个错误,阻止您使用selectableInterface Builder中的属性,但从代码中工作.
当然,canBecomeFocused()和didUpdateFocusInContext必须得实现.您还需要传递一个UIViewController因为UITextView无法呈现模态视图控制器.贝娄是我最终创造的.
class FocusableText: UITextView {
var data: String?
var parentView: UIViewController?
override func awakeFromNib() {
super.awakeFromNib()
let tap = UITapGestureRecognizer(target: self, action: "tapped:")
tap.allowedPressTypes = [NSNumber(integer: UIPressType.Select.rawValue)]
self.addGestureRecognizer(tap)
}
func tapped(gesture: UITapGestureRecognizer) {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
if let descriptionView = storyboard.instantiateViewControllerWithIdentifier("descriptionView") as? DescriptionViewController {
if let view = parentView {
if let show = show {
descriptionView.descriptionText = self.data
view.modalPresentationStyle = UIModalPresentationStyle.OverFullScreen
view.presentViewController(descriptionView, animated: true, completion: nil)
}
}
}
}
override func canBecomeFocused() -> Bool {
return true
}
override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) {
if context.nextFocusedView == self {
coordinator.addCoordinatedAnimations({ () -> Void in
self.layer.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.2).CGColor
}, completion: nil)
} else if context.previouslyFocusedView == self {
coordinator.addCoordinatedAnimations({ () -> Void in
self.layer.backgroundColor = UIColor.clearColor().CGColor
}, completion: nil)
}
}
}
Run Code Online (Sandbox Code Playgroud)
至于使 UILabel 可聚焦:
class MyLabel: UILabel {
override var canBecomeFocused: Bool {
return true
}
override func didUpdateFocus(in context: UIFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) {
super.didUpdateFocus(in: context, with: coordinator)
backgroundColor = context.nextFocusedView == self ? .blue:.red
}
}
Run Code Online (Sandbox Code Playgroud)
重要的!!!正如苹果开发者门户网站上所述:
如果视图可以聚焦,则此属性的值为 true;否则为假。
默认情况下,该属性的值为 false。此属性通知焦点引擎视图是否能够获得焦点。有时,即使视图返回 true,视图也可能由于以下原因而无法获得焦点:
该视图已隐藏。
该视图的 alpha 设置为 0。
该视图将 userInteractionEnabled 设置为 false。
该视图当前不在视图层次结构中。