5

を使用UIButtonすると、tvOS は、ボタンがフォーカスされ、ユーザーがリモコンをタップしたときに (iOS の場合のように ではUIControlEvents.PrimaryActionTriggeredなく) 生成します。.TouchUpInside

UIControlただし、これらのイベントのいずれも生成されないようです。実際、ユーザーがコントロールに焦点を合わせてリモコンをタップすると、イベントが生成されることがわかりません。

UIControltvOSのカスタムをどのように使用しますか?

4

2 に答える 2

6

AUIControlは、それ自体では制御イベントを発行しません。サブクラスは、イベントを発行する責任があります (通常は、それ自体を送信しますsendActionsForControlEvents:)。

UIControlは現在 tvOS 用に文書化されていないため、Apple がサブクラス化を望んでいない可能性があります。

とにかく、私はそれを少しいじっただけですが、明らかに独自のUIControlサブクラスを実装するには、 canBecomeFocusedreturnYESにオーバーライドする必要があり、ユーザーのプレスに応じて動作するようにオーバーライドpressesEnded:withEvent:する必要があります (おそらく自分自身を送信することによってsendActionsForControlEvents:)。

pressesBegan:withEvent:コントロールを強調表示するためにオーバーライドすることもできます。

は( 経由で) プロトコルUIControlに準拠しているため、オーバーライドして、フォーカスがあるかどうかに応じてコントロールの外観を更新できます。UIFocusEnvironmentUIViewdidUpdateFocusInContext: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 に答える