UIControl在tvOS上发生了哪些事件?

时间:2015-09-16 19:13:50

标签: tvos

使用UIButton时,当按钮获得焦点并且用户点击遥控器时,tvOS会生成UIControlEvents.PrimaryActionTriggered(不是.TouchUpInside,就像在iOS上一样)。

但是,

UIControl似乎不会产生这些事件的。事实上,当用户专注于控制并点击遥控器时,我看不出它会产生任何事件。

如何为tvOS使用自定义UIControl

2 个答案:

答案 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似乎按照我的预期工作。