1

私は BGUDSegmentedCell のバージョンを使用して、HUD スタイルのセグメント化されたコントロール (NSSegmentedControl) を描画しています。

ただし、ユーザーがセグメントをクリックしている間、「押された」状態でセルを描画する方法がわかりません(ユーザーが適切な追跡フィードバックを取得できるようにするため)。デフォルトの NSSegmentedControl/Cell がこれを管理するため、おそらくシステム コードですが、それがパブリックな方法であるかどうかを知る方法があります。

サブクラスは以下をオーバーライドします。

- (void)drawWithFrame:(NSRect)frame inView:(NSView *)view {
- (void)drawSegment:(NSInteger)segment inFrame:(NSRect)frame withView:(NSView *)view {

NSSegmentedCell に、「押された」状態でセグメントを描画していることを判断し、追跡中に適切に表示する方法はありますか?

4

5 に答える 5

2

NSCell のマウス追跡メソッドをオーバーライドして、独自のダウン/プレス状態追跡を実装するのがおそらく最善です。

- (BOOL)startTrackingAt:(NSPoint)startPoint inView:(NSView *)controlView;
- (void)stopTracking:(NSPoint)lastPoint at:(NSPoint)stopPoint inView:(NSView *)controlView mouseIsUp:(BOOL)flag;
- (BOOL)continueTracking:(NSPoint)lastPoint at:(NSPoint)currentPoint inView:(NSView *)controlView;

と組み合わせることで-(CGFloat)widthForSegment:(NSInteger)segment;、マウスが押されたセグメントを特定し、適切にレンダリングするのに十分でしょう。

于 2013-06-02T10:14:07.497 に答える
0

私は方法を発見しました。理想的ではありませんが、私のテストと私のケースでは機能しますが、プライベート NSSegmentedCell メソッドを使用します。

- (NSInteger)_segmentHighlightState:(NSInteger)arg1;

このメソッドは、選択されていないセルの場合は 1、追跡中に押されている間は選択されていないセルの場合は 3、選択されたセルの場合は 4、追跡中に押されている間の選択されたセルの場合は 5 を返します。

したがって、ビット 1 (0x02 でマスク) をテストすると、目的の「押された」状態が得られます。悲しいことに、Mac App Store で出荷したい場合、これは役に立ちませんが、サンドボックス要件のために Keyboard Maestro が Mac App Store から除外されているため、私にはもう関係ありません。

次のようなコードを使用して、可能な変更に対して防御する価値があります。

- (BOOL) mySegmentIsPressed:(int)segment;
{
    NSInteger highlightState = 0;
    if ( [self respondsToSelector:@selector(_segmentHighlightState:)] ) {
        highlightState = [self _segmentHighlightState:segment];
    } else {
        highlightState = ([self selectedSegment] == segment) ? 4 : 1;
    }
    return (highlightState&2) != 0;
}

@arun.s が提案した startTrackingAt メソッドは、NSSegmentedControl が別の不明なトラッキング エリアを使用するため機能しません)。さらに、rectForSegment:inFrame もプライベート メソッドであるため、(以下)プライベートメソッド。

これを行うには文書化された方法が必要ですが、コントロール全体を新たに実装するまでは方法がわかりません。

于 2013-03-13T07:13:53.880 に答える
0

このようにsegmentcellクラスで確認できます

NSLog(@"selectedSegment - > ",[self selectedSegment]);

選択したセグメント インデックスを確認し、必要な操作を行います。

お役に立てれば !!!

于 2013-03-11T11:55:53.333 に答える
-1

プレス状態を実装する方法は次のとおりです。

- (void) drawSegment:(NSInteger)segment inFrame:(NSRect)frame withView:(NSView *)controlView
    {
        NSColor *startColor = [NSColor colorWithDeviceRed:0.690196 green:0.690196 blue:0.690196 alpha:1.0];
        NSColor *endColor = [NSColor colorWithDeviceRed:0.878431 green:0.878431 blue:0.878431 alpha:1.0];
        NSGradient *grad = [[NSGradient alloc] initWithStartingColor:startColor endingColor:endColor];

        if(![self isSelectedForSegment:segment]) {
            [grad drawInRect:frame angle:270];
        }
        [super drawSegment:segment inFrame:frame withView:controlView];
    }

押されていない状態では、セグメント化されたコントロールはグラデーションを描画して、ツールバー (またはウィンドウの境界線) の背景を模倣します。コントロールが押されたときに描画しません。

于 2013-06-02T13:28:17.013 に答える