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

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

wrong_image

如果分段控制具有更多的分段,这总是(并且仅仅)从第三分段切换到第一分段时发生。

我发现在valueChanged:事件纠正显示后,发送setNeedsLayout消息给UISegmentedControl对象。

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

有点丑陋的解决方法,但我设法修复它,直到苹果修复它本身。

首先,您需要inheritanceUISegmentedControl并添加以下内容:

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