5

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

UIControl然而,似乎并没有产生这些事件中的任何一个。实际上,当用户专注于控件并点击遥控器时,我看不到它会产生任何事件。

如何UIControl为 tvOS 使用自定义?

4

2 回答 2

6

AUIControl不会自行发出任何控制事件。您的子类负责发出事件(通常通过发送自己sendActionsForControlEvents:)。

由于UIControl目前没有针对 tvOS 的文档,因此 Apple 可能不希望您对其进行子类化。

无论如何,我只玩了一点,但显然要实现您自己的UIControl子类,您必须覆盖canBecomeFocused返回YES,并且您必须覆盖pressesEnded:withEvent:以对用户的按下采取行动(可能是通过发送自己sendActionsForControlEvents:。)。

您可能还想覆盖pressesBegan:withEvent:以突出显示您的控件。

因为UIControl符合UIFocusEnvironment协议(通过UIView),您可以覆盖didUpdateFocusInContext:withAnimationCoordinator:以更新控件的外观,具体取决于它是否具有焦点。

于 2015-09-16T20:04:51.393 回答
0

在过去的几周里,我用我的 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 似乎按我期望的方式工作。

于 2015-10-19T15:33:18.730 回答