1

次のコードを使用して、UISegmentedControlの外観をカスタマイズしました。

UIImage *bg = [UIImage imageNamed:@"segment_bg"];
UIImage *bg_sel = [UIImage imageNamed:@"segment_sel"];
UIImage *leftSep = [UIImage imageNamed:@"segment_div_sx"];
UIImage *rightSep = [UIImage imageNamed:@"segment_div_dx"];

UIEdgeInsets selectionInsets = UIEdgeInsetsMake(0, 8, 0, 8);

[self.segmentedControl setBackgroundImage:[bg resizableImageWithCapInsets:UIEdgeInsetsZero]
                        forState:UIControlStateNormal
                      barMetrics:UIBarMetricsDefault];

[self.segmentedControl setBackgroundImage:[bg_sel resizableImageWithCapInsets:selectionInsets]
                        forState:UIControlStateSelected
                      barMetrics:UIBarMetricsDefault];

[self.segmentedControl setBackgroundImage:[bg resizableImageWithCapInsets:UIEdgeInsetsZero]
                        forState:UIControlStateNormal
                      barMetrics:UIBarMetricsDefault];

[self.segmentedControl setDividerImage:[bg resizableImageWithCapInsets:UIEdgeInsetsZero]
          forLeftSegmentState:UIControlStateNormal
            rightSegmentState:UIControlStateNormal
                   barMetrics:UIBarMetricsDefault];

[self.segmentedControl setDividerImage:rightSep
          forLeftSegmentState:UIControlStateSelected
            rightSegmentState:UIControlStateNormal
                   barMetrics:UIBarMetricsDefault];

[self.segmentedControl setDividerImage:leftSep
          forLeftSegmentState:UIControlStateNormal
            rightSegmentState:UIControlStateSelected
                   barMetrics:UIBarMetricsDefault];

次の画像でわかるように、すべてが正常に見えます。また、他のセグメントも切り替え時に見栄えがします。

correct_image

しかし、3番目のセグメントから最初のセグメントに切り替えると、セグメントの仕切りが間違っています(右端に丸い角がないため、正しい仕切りではありません)。

間違った画像

セグメント化されたコントロールにさらに多くのセグメントがある場合、これは3番目のセグメントから最初のセグメントに切り替えるときに常に(そしてのみ)発生します。

valueChanged:イベントの後にsetNeedsLayoutメッセージをUISegmentedControlオブジェクトに送信すると、表示が修正されることがわかりました。

さて、セグメント化されたコントロールをカスタマイズする方法に何か問題がありますか、それは既知のバグですか、それともこれを1つとして報告する必要がありますか?

4

1 に答える 1

0

少し醜い回避策ですが、アップルがそれ自体を修正するまで、次の方法で修正できました。

まず、UISegmentedControl をサブクラス化し、以下を追加する必要があります。

@implementation MJSegmentedControl

- (void)layoutSubviews
{
    [super layoutSubviews];
    NSInteger cachedIndex = self.selectedSegmentIndex;
    self.selectedSegmentIndex = 0;
    self.selectedSegmentIndex = cachedIndex;
}

@end
于 2012-09-01T09:53:23.230 に答える