使用UIButton
时,当按钮获得焦点并且用户点击遥控器时,tvOS会生成UIControlEvents.PrimaryActionTriggered
(不是.TouchUpInside
,就像在iOS上一样)。
UIControl
似乎不会产生这些事件的。事实上,当用户专注于控制并点击遥控器时,我看不出它会产生任何事件。
如何为tvOS使用自定义UIControl
?
答案 0 :(得分:4)
UIControl
不会自行发出任何控件事件。您的子类负责发出事件(通常通过发送自己sendActionsForControlEvents:
)。
由于目前没有为tvOS记录UIControl
,因此Apple可能不希望您将其子类化。
无论如何,我只是玩了一点,但显然要实现你自己的UIControl
子类,你必须覆盖canBecomeFocused
才能返回YES
,你必须覆盖{ {1}}对用户的媒体采取行动(可能是通过发送给自己pressesEnded:withEvent:
。)。
您可能还想覆盖sendActionsForControlEvents:
以突出显示您的控件。
由于pressesBegan:withEvent:
符合UIControl
协议(通过UIFocusEnvironment
),您可以覆盖UIView
以更新控件的外观,具体取决于它是否具有焦点。< / p>
答案 1 :(得分:0)
我花了几周的时间为我用我的SVG渲染库SVGgh添加的小部件添加了tvOS支持,所以我对此有点感觉。问题在于我认为有一种新的或新的行动:UIControlEventPrimaryActionTriggered在控件想要传达行动承诺时发出,就像我对{{3}中UIPress的完成的响应一样}类。请记住在故事板中将选择器连接到此新操作。
-(void) pressesEnded:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)event
{
[self sendActionsForControlEvents:UIControlEventPrimaryActionTriggered];
self.beingPressed = NO;
self.selected = self.selected;
}
但是在分段控制模拟中,操作不会在按钮按下时设置,但是当聚焦的部分发生变化时,如下所示(为了清晰起见,编码很大)代码来自GHButton类:
- (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似乎按照我的预期工作。