UISegmentedControl 错误自定义处理
Posted
技术标签:
【中文标题】UISegmentedControl 错误自定义处理【英文标题】:UISegmentedControl wrong customization handling 【发布时间】:2012-08-04 10:55:01 【问题描述】:我使用以下代码自定义了 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];
如下图所示,一切看起来都很好,切换时其他部分看起来也不错:
但是当我从第三段切换到第一段时,段分隔符是错误的(右端没有圆角,所以不是正确的分隔符)。
如果分段控件有更多的段,这种情况总是(且仅)在从第三段切换到第一段时发生。
我发现在 valueChanged: 事件之后向 UISegmentedControl 对象发送 setNeedsLayout 消息可以更正显示。
现在,我自定义分段控件的方式是否有问题,是已知错误还是我应该将其报告为错误?
【问题讨论】:
【参考方案1】:有点丑陋的解决方法,但我设法用以下方法修复它,直到苹果自己修复它。
首先你需要继承 UISegmentedControl 并添加以下内容:
@implementation MJSegmentedControl
- (void)layoutSubviews
[super layoutSubviews];
NSInteger cachedIndex = self.selectedSegmentIndex;
self.selectedSegmentIndex = 0;
self.selectedSegmentIndex = cachedIndex;
@end
【讨论】:
以上是关于UISegmentedControl 错误自定义处理的主要内容,如果未能解决你的问题,请参考以下文章
UISegmentedControl 错误的dividerImage
UINavigationController 的自定义 UIBarButtonItem/UISegmentedControl
如何在 iPad 的导航栏中调整自定义 UISegmentedControl 的大小?