使用,当按钮获得焦点并且用户点击遥控器时UIButton
,tvOS 会产生UIControlEvents.PrimaryActionTriggered
(不像在 iOS 上那样)。.TouchUpInside
UIControl
然而,似乎并没有产生这些事件中的任何一个。实际上,当用户专注于控件并点击遥控器时,我看不到它会产生任何事件。
如何UIControl
为 tvOS 使用自定义?
使用,当按钮获得焦点并且用户点击遥控器时UIButton
,tvOS 会产生UIControlEvents.PrimaryActionTriggered
(不像在 iOS 上那样)。.TouchUpInside
UIControl
然而,似乎并没有产生这些事件中的任何一个。实际上,当用户专注于控件并点击遥控器时,我看不到它会产生任何事件。
如何UIControl
为 tvOS 使用自定义?
AUIControl
不会自行发出任何控制事件。您的子类负责发出事件(通常通过发送自己sendActionsForControlEvents:
)。
由于UIControl
目前没有针对 tvOS 的文档,因此 Apple 可能不希望您对其进行子类化。
无论如何,我只玩了一点,但显然要实现您自己的UIControl
子类,您必须覆盖canBecomeFocused
返回YES
,并且您必须覆盖pressesEnded:withEvent:
以对用户的按下采取行动(可能是通过发送自己sendActionsForControlEvents:
。)。
您可能还想覆盖pressesBegan:withEvent:
以突出显示您的控件。
因为UIControl
符合UIFocusEnvironment
协议(通过UIView
),您可以覆盖didUpdateFocusInContext:withAnimationCoordinator:
以更新控件的外观,具体取决于它是否具有焦点。
在过去的几周里,我用我的 SVG 渲染库SVGgh为我打包的小部件添加了 tvOS 支持,所以我对此有点感觉。问题是我认为有一种新的或新的动作:当控件想要传达动作承诺时发送的 UIControlEventPrimaryActionTriggered ,就像在我的GHButton类中对 UIPress 完成的响应中一样。请记住将选择器连接到情节提要中的这个新动作。
-(void) pressesEnded:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)event
{
[self sendActionsForControlEvents:UIControlEventPrimaryActionTriggered];
self.beingPressed = NO;
self.selected = self.selected;
}
但是在分段控制模拟中,操作不是在按钮按下时设置的,而是当焦点段发生更改时,如下面的(为了清晰起见,进行了大量编辑)代码中的GHSegmentedControl类:
- (BOOL)shouldUpdateFocusInContext:(UIFocusUpdateContext *)context
{
BOOL result = NO;
if(context.nextFocusedView == self)
{
result = YES;
[self highlight:YES];
if(context.focusHeading == UIFocusHeadingRight)
{
[self incrementValue];
[self.parentContent.control setNeedsFocusUpdate];
[self sendActionsForControlEvents:UIControlEventValueChanged];
}
else if(context.focusHeading == UIFocusHeadingLeft)
{
[self decrementValue];
[self.parentContent.control setNeedsFocusUpdate];
[self sendActionsForControlEvents:UIControlEventValueChanged];
}
}
return result;
}
现在我想到了,有可能我也应该在分段控件中发送一个 UIControlEventPrimaryActionTriggered 操作,但 UIControlEventValueChanged 似乎按我期望的方式工作。