UISegmentedControl背景图片奇怪的行为

时间:2013-02-27 11:45:34

标签: ios objective-c uisegmentedcontrol

我正在开发一个iOS项目并遇到了这个奇怪的问题。我有一个UISegmentedControl元素的bar元素。它有3个部分。这些片段的固定大小为80.我还有3张图片,每个片段都被选中以设置为背景。这是其中之一`

enter image description here

加载视图时,其中一个片段设置为已选中,此图像设置为背景,如下所示:

[self.genderSelectionButton setBackgroundImage:[UIImage imageNamed:@"gender-switch01.png"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

现在当我在5.1 Simulator上运行项目时,我得到了分段按钮的这个扭曲视图:

enter image description here

正如您所看到的,中间部分保持我给出的尺寸,但图像从中间到边缘都是一种拉伸。 即使我已将其设置为NO,也会突出显示所选的细分。 在侦听按钮选择的方法中,我更改背景图像并获得以下内容: enter image description here

(背景图像再次拉伸......)

在iOS6上几乎一样。 我现在做错了什么,或者有办法解决这个问题吗?

修改

找到一个更好的实现,使用单独的图像为普通按钮,选定的按钮和分隔线。请参阅下面的答案。

1 个答案:

答案 0 :(得分:1)

设置完整的背景图像似乎不是处理自定义分段按钮的最佳方式。找到示例here

以下是执行所有操作的基本代码:

UIImage *segmentSelected = 
    [[UIImage imageNamed:@"segcontrol_sel.png"] 
        resizableImageWithCapInsets:UIEdgeInsetsMake(0, 15, 0, 15)];
UIImage *segmentUnselected = 
    [[UIImage imageNamed:@"segcontrol_uns.png"] 
        resizableImageWithCapInsets:UIEdgeInsetsMake(0, 15, 0, 15)];
UIImage *segmentSelectedUnselected = 
    [UIImage imageNamed:@"segcontrol_sel-uns.png"];
UIImage *segUnselectedSelected = 
    [UIImage imageNamed:@"segcontrol_uns-sel.png"];
UIImage *segmentUnselectedUnselected = 
    [UIImage imageNamed:@"segcontrol_uns-uns.png"];

[[UISegmentedControl appearance] setBackgroundImage:segmentUnselected 
    forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[[UISegmentedControl appearance] setBackgroundImage:segmentSelected 
    forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];

[[UISegmentedControl appearance] setDividerImage:segmentUnselectedUnselected 
    forLeftSegmentState:UIControlStateNormal 
    rightSegmentState:UIControlStateNormal 
    barMetrics:UIBarMetricsDefault];
[[UISegmentedControl appearance] setDividerImage:segmentSelectedUnselected 
    forLeftSegmentState:UIControlStateSelected 
    rightSegmentState:UIControlStateNormal 
    barMetrics:UIBarMetricsDefault];
[[UISegmentedControl appearance] 
    setDividerImage:segUnselectedSelected 
    forLeftSegmentState:UIControlStateNormal 
    rightSegmentState:UIControlStateSelected 
    barMetrics:UIBarMetricsDefault];