与UIButton
, tvOS产生UIControlEvents.PrimaryActionTriggered
(而不是.TouchUpInside
,因为它在iOS上),当按钮获得焦点,用户点击遥控器。
UIControl
似乎不产生这些事件中的。我看不出它会产生任何事件,事实上,当用户专注于控制并点击遥控器时。
如何为tvOS使用自定义UIControl
?
UIControl
不会自动发出任何控制事件。你的子类负责发出事件(通常通过发送自身sendActionsForControlEvents:
)。
由于UIControl
目前没有用于tvOS的文档,这可能是苹果不希望你子类化它。
无论如何,我只玩了一点,但显然要实现你自己的UIControl
子类,你必须覆盖canBecomeFocused
来返回YES
,你必须覆盖pressesEnded:withEvent:
来作用于用户的按下(大概是通过发送自己的sendActionsForControlEvents:
.)。
您可能还需要重写pressesBegan:withEvent:
以突出显示您的控件。
因为UIControl
符合UIFocusEnvironment
协议(通过UIView
),你可以覆盖didUpdateFocusInContext:withAnimationCoordinator:
来更新你的控件的外观取决于它是否有焦点。
我花了几周时间为我用SVG渲染库SVGgh打包的小部件添加tvOS支持,所以我对此有一些感觉。问题是,有什么我认为是一个新的或新的类型的行动:uicontroleventprimaryaction触发器,得到发送时,控制想要沟通的承诺的行动,如在这个响应完成在我的GHButton类UIPress。记得在故事板中将一个选择器连接到这个新动作。
-(void) pressesEnded:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)event
{
[self sendActionsForControlEvents:UIControlEventPrimaryActionTriggered];
self.beingPressed = NO;
self.selected = self.selected;
}
但是在分段控制模拟中,动作不是设置在按钮上,而是当聚焦的部分被改变时,如以下(为了清晰而大量编辑)来自我的liegmentedControl类的代码:
- (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动作在分段控制以及但uicontroleventvaluechange似乎工作的方式我期望的。