4

UISegmentedControl ディバイダーで奇妙なバグに遭遇しました。指を離すと、セグメントは強調表示された状態の画像を失いますが、仕切りにはそれが保持されます。これを行うには、約 100px ドラッグする必要があります。

ダウン、目標通り:

目標を達成

下、指をドラッグしてターゲットから離す:

ダウンオフターゲット

0 は通常の状態、1 は選択された状態、2 は強調表示された状態を意味します。私はすべての適切な分割画像を持っており、それぞれのケースに合わせて設定しています。つまり、次のとおりです。

00, 01, 02
10, 11, 12
20, 21, 22

ターゲットをタップアンドホールドしても問題はありません。ユーザーがタップしてドラッグすることはないと思いますが、これを解決してもらいたいです。誰もこれを経験したことがありますか?

4

3 に答える 3

3

「11」と「22」の状態の区切り画像を提供する必要はありません。論理的には、2 つの隣接する選択されたセグメントまたは 2 つの隣接する強調表示されたセグメントを持つことはできないためです。まあ、隣接するセグメントを同時にタップすると両方が強調表示される場合に限りますが、そうではありません.

したがって、次の分割イメージが必要です。

00, 01, 02  
10, --, 12  
20, 21, --

さらに、3 つの異なる状態 (Normal、Selected、Highlighted) ごとに 3 つの背景画像も用意する必要があります。これらの背景画像の理由と作成方法については、ここで説明しました(その説明では、通常状態と選択状態の 2 つの背景画像のみを使用しましたが、ハイライト状態を使用する場合は、3 番目の背景画像を追加する必要があります。 )。

これらの画像が UISegmentedControl でどのように使用されるかを示す図を次に示します。 ここに画像の説明を入力

次に、次の外観方法を使用してそれらを設定します。

// Set background images
[segmentedControl setBackgroundImage:background_image_normal
                            forState:UIControlStateNormal
                          barMetrics:UIBarMetricsDefault];
[segmentedControl setBackgroundImage:background_image_selected
                            forState:UIControlStateSelected
                          barMetrics:UIBarMetricsDefault];
[segmentedControl setBackgroundImage:background_image_highlighted
                            forState:UIControlStateHighlighted
                          barMetrics:UIBarMetricsDefault];

// Set divider images 0=Normal 1=Selected 2=Highlighted
[segmentedControl setDividerImage:divider_image_00
              forLeftSegmentState:UIControlStateNormal
                rightSegmentState:UIControlStateNormal
                       barMetrics:UIBarMetricsDefault]
[segmentedControl setDividerImage:divider_image_01
              forLeftSegmentState:UIControlStateNormal
                rightSegmentState:UIControlStateSelected
                       barMetrics:UIBarMetricsDefault]
[segmentedControl setDividerImage:divider_image_10
              forLeftSegmentState:UIControlStateSelected
                rightSegmentState:UIControlStateNormal
                       barMetrics:UIBarMetricsDefault]
[segmentedControl setDividerImage:divider_image_02
              forLeftSegmentState:UIControlStateNormal
                rightSegmentState:UIControlStateHighlighted
                       barMetrics:UIBarMetricsDefault]
[segmentedControl setDividerImage:divider_image_20
              forLeftSegmentState:UIControlStateHighlighted
                rightSegmentState:UIControlStateNormal
                       barMetrics:UIBarMetricsDefault]
[segmentedControl setDividerImage:divider_image_12
              forLeftSegmentState:UIControlStateSelected
                rightSegmentState:UIControlStateHighlighted
                       barMetrics:UIBarMetricsDefault]
[segmentedControl setDividerImage:divider_image_21
              forLeftSegmentState:UIControlStateHighlighted
                rightSegmentState:UIControlStateSelected
                       barMetrics:UIBarMetricsDefault]
于 2013-03-21T13:04:29.330 に答える
0

考えられる解決策は、UISegmentedControlを手動でサブクラス化し、それをオーバーライドして、UIResponderイベントが呼び出されたときに分周器の状態が適切に「クリーンアップ」されるようにすることです。セグメントは、touchesMovedイベントが最初のtouchesBeganと同じ境界内で発生することを予期している可能性があります。

于 2013-03-07T11:30:17.043 に答える
0

UIControlStateSelected | を忘れないでください。UIControlStateHighlighted

// Set background images
UIImage *normalBackgroundImage = [UIImage imageNamed:@"segmented-background-unselected"];
UIImage *selectedBackgroundImage = [UIImage imageNamed:@"segmented-background-selected"];
[self setBackgroundImage:normalBackgroundImage
                forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[self setBackgroundImage:selectedBackgroundImage
                forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
[self setBackgroundImage:normalBackgroundImage
                forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault];
[self setBackgroundImage:selectedBackgroundImage
                forState:UIControlStateSelected | UIControlStateHighlighted barMetrics:UIBarMetricsDefault];

// Set divider images
UIImage *buttonImageLeftSelected = [UIImage imageNamed:@"segmented-left-selected"];
UIImage *buttonImageNoneSelected = [UIImage imageNamed:@"segmented-none-selected"];
UIImage *buttonImageRightSelected = [UIImage imageNamed:@"segmented-right-selected"];

[self   setDividerImage:buttonImageNoneSelected
    forLeftSegmentState:UIControlStateNormal
      rightSegmentState:UIControlStateNormal
             barMetrics:UIBarMetricsDefault];

[self   setDividerImage:buttonImageLeftSelected
    forLeftSegmentState:UIControlStateSelected
      rightSegmentState:UIControlStateNormal
             barMetrics:UIBarMetricsDefault];
[self   setDividerImage:buttonImageLeftSelected
    forLeftSegmentState:UIControlStateSelected | UIControlStateHighlighted
      rightSegmentState:UIControlStateNormal
             barMetrics:UIBarMetricsDefault];
[self   setDividerImage:buttonImageLeftSelected
    forLeftSegmentState:UIControlStateSelected
      rightSegmentState:UIControlStateHighlighted
             barMetrics:UIBarMetricsDefault];

[self   setDividerImage:buttonImageRightSelected
    forLeftSegmentState:UIControlStateHighlighted
      rightSegmentState:UIControlStateSelected
             barMetrics:UIBarMetricsDefault];
[self   setDividerImage:buttonImageRightSelected
    forLeftSegmentState:UIControlStateNormal
      rightSegmentState:UIControlStateSelected | UIControlStateHighlighted
             barMetrics:UIBarMetricsDefault];
[self   setDividerImage:buttonImageRightSelected
    forLeftSegmentState:UIControlStateNormal
      rightSegmentState:UIControlStateSelected
             barMetrics:UIBarMetricsDefault];
于 2015-02-09T13:28:56.943 に答える