UISegmentedControl和UIAppearance的奇怪行为

5
我正在通过在应用程序委托中使用以下语句来设置分段控件的外观。
    [[UISegmentedControl appearance] setBackgroundImage:[[UIImage imageNamed:@"segmentation_normal.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0 , 0, 0)] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
    [[UISegmentedControl appearance] setBackgroundImage:[[UIImage imageNamed:@"segmentation_selected.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0 , 0, 0)] 
        forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];

    [[UISegmentedControl appearance] setDividerImage:[UIImage imageNamed:@"segmentation_divider_NormalNormal.png"]   forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
    [[UISegmentedControl appearance] setDividerImage:[UIImage imageNamed:@"segmentation_divider_NormalSelected.png"] forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
    [[UISegmentedControl appearance] setDividerImage:[UIImage imageNamed:@"segmentation_divider_SelectedNormal.png"] forLeftSegmentState:UIControlStateSelected rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

结果还不错。当我选择任何一个段(在应用程序首次启动时默认选择“订单”段)时,背景和分隔符都设置正确。如下图所示,当我选择“发布”段时,一切看起来都很好。 enter image description here 问题是当我离开视图然后返回视图时(我存储所选索引并在viewDidLoad中设置它以重新选择段),由于某种未知原因,分隔符被设置错误。 enter image description here 如果我先点击A-Z,再点击Release,则会自动纠正。此错误仅在视图首次加载且选择的段为Release或A-Z时才会发生。当选择Order并加载视图时,分隔符始终看起来很好。
图像尺寸:分隔符宽2像素(所有3个图像尺寸相同),背景每个宽2像素。
非常感谢您提供任何想法或指针,我已经花了过去10个小时试图找到解决方案但一无所获。

viewDidLoad 中设置 UISegmentedControl 的选中索引后,调用 UISegmentedControlsetNeedsDisplay 方法。也许这样可以解决问题。 - Zeus Alexander
我也遇到了这个问题。该死 :( - runmad
如果你还在寻找解决方法,可以尝试以下@runmad的解决方案... - jrturton
1个回答

7

我认为这是UISegmentedControl的一个bug。您可以通过延迟设置选定的段来解决此问题,以允许控件有足够的时间进行绘制。您甚至不需要使用实际的延迟,只需使用类似以下内容的东西:

[self performSelector:@selector(setPreferences) withObject:nil afterDelay:0.0];

在这里,setPreferences 函数更新了您的分段控制器的值。


它运行得非常好。但我想知道背后的真正原因是什么? - geekay
1
因为它将在第一个运行循环之后执行(分段控件已经绘制!),所以这个错误是已知的错误,并且在iOS 6中已经修复。 - Mathias Aichinger
这个 bug 奇怪地在 ios7 中重新出现了。 - holierthanthou84

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接