UISegmentedControl错误的自定义处理

时间:2012-08-04 10:55:02

标签: ios uisegmentedcontrol

我使用以下代码自定义了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

但是当我从第三段切换到第一段时,段分隔符错误(右端没有圆角,所以没有正确的分隔符。)

wrong_image

如果分段控件有更多段,则从第三段切换到第一段时总是(并且仅)发生这种情况。

我发现在 valueChanged:事件之后将 setNeedsLayout 消息发送到UISegmentedControl对象会更正显示。

现在,我定制分段控件的方式有问题吗,这是一个已知错误还是我应该将其报告为一个?

1 个答案:

答案 0 :(得分:0)

有点丑陋的解决方法,但我设法用以下方法修复它,直到苹果自己修复它。

首先,您需要继承UISegmentedControl并添加以下内容:

@implementation MJSegmentedControl

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

@end