Objective c 设置背景图像时,未设置的UISegmentedControl段宽度

Objective c 设置背景图像时,未设置的UISegmentedControl段宽度,objective-c,ios,cocoa-touch,ios5,uisegmentedcontrol,Objective C,Ios,Cocoa Touch,Ios5,Uisegmentedcontrol,我有一个分段控件,我希望第一个和最后一个项具有指定的宽度(例如,比其他项宽)。当我为标准样式的分段控件(即[[UISegmantedControl appearance]setBackgroundImage:forState:barMetrics:未设置)设置宽度:forSegmentAtIndex:时,事情会按其应有的方式运行。但当我设置背景图像时,分段宽度并没有改变 这是我的密码: [[UISegmentedControl外观]setBackgroundImage:[[UIImage Im

我有一个分段控件,我希望第一个和最后一个项具有指定的宽度(例如,比其他项宽)。当我为标准样式的分段控件(即
[[UISegmantedControl appearance]setBackgroundImage:forState:barMetrics:
未设置)设置宽度:forSegmentAtIndex:时,事情会按其应有的方式运行。但当我设置背景图像时,分段宽度并没有改变

这是我的密码:

[[UISegmentedControl外观]setBackgroundImage:[[UIImage ImageName:@“btn_normal.png”]StretcableImageWithLeftCapWidth:25 topCapHeight:0]用于状态:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[[UISegmentedControl外观]setBackgroundImage:[UIImage ImageName:@“btn_selected.png”]StretcableImageWithLeftCapWidth:25 topCapHeight:0]用于状态:UIControlStateSelected barMetrics:UIBarMetricsDefault];
[[UISegmentedControl外观]setDividerImage:[UIImage ImageName:@“nn.png”]forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[[UISegmentedControl外观]setDividerImage:[UIImage ImageName:@“sn.png”]forLeftSegmentState:UIControlStateSelected rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[[UISegmentedControl外观]setDividerImage:[UIImage ImageName:@“ns.png”]forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
[self.segmentedControl setContentMode:UIViewContentModeScaleToFill];
[self.segmentedcontrolsetwidth:100.0表示分段索引:0];
[self.segmentedcontrolsetwidth:100.0表示分段索引:4];
这样,我的所有片段都会自动调整为相同的宽度。
当我把这一切都说出来的时候

[self.segmentedControl setContentMode:UIViewContentModeScaleToFill];
[self.segmentedcontrolsetwidth:100.0表示分段索引:0];
[self.segmentedcontrolsetwidth:100.0表示分段索引:4];
尺寸设置正确。
我的问题是:如何设置背景图像片段的大小?
我不熟悉cocoa touch和objective-c,所以我可能遗漏了一些东西…

您能帮忙吗?

我想当您使用[UISegmentedControl外观]代理时,它会覆盖“setWidth:forSegmentAtIndex:”方法值。因此,可能的解决办法:

(一)

我不建议使用它,因为它将为应用程序中的每个分段控件设置0和4个分段的自定义宽度

(二)

如果您需要应用程序中的所有分段控件都具有自定义背景,那么我建议您编写自己的代理方法。大概是这样的:

- (UISegmentedControl *) customSegmentedControl {
    UISegmentedControl *segmentedControl = [ [ [UISegmentedControl alloc] init] autorelease];

    [segmentedControl setBackgroundImage: [ [UIImage imageNamed: @"btn_normal.png"] stretchableImageWithLeftCapWidth: 25 topCapHeight: 0] forState: UIControlStateNormal barMetrics: UIBarMetricsDefault];
    [segmentedControl setBackgroundImage: [ [UIImage imageNamed: @"btn_selected.png"] stretchableImageWithLeftCapWidth: 25 topCapHeight: 0] forState: UIControlStateSelected barMetrics: UIBarMetricsDefault];
    [segmentedControl setDividerImage: [UIImage imageNamed: @"nn.png"] forLeftSegmentState: UIControlStateNormal rightSegmentState: UIControlStateNormal barMetrics: UIBarMetricsDefault];
    [segmentedControl setDividerImage: [UIImage imageNamed: @"sn.png"] forLeftSegmentState: UIControlStateSelected rightSegmentState: UIControlStateNormal barMetrics: UIBarMetricsDefault];
    [segmentedControl setDividerImage: [UIImage imageNamed: @"ns.png"] forLeftSegmentState: UIControlStateNormal rightSegmentState: UIControlStateSelected barMetrics: UIBarMetricsDefault];

    return segmentedControl;
}

我通过编写自定义控件解决了这个问题,基于此

谢谢你,Igor!但我的问题是关于细分市场的规模。我通过编写自定义控件解决了这个问题。@voiger,Igor是对的。通过在实际实例而不是外观实例上设置背景图像,可以在各个分段上设置宽度。只有通过外观应用背景图像时,才会忽略指定的宽度。这似乎在iOS 6.0中已经修复,因此目前只有iOS 5.0中出现了故障。
[self.segmentedControl setBackgroundImage:[[UIImage imageNamed:@"btn_normal.png"] stretchableImageWithLeftCapWidth:25 topCapHeight:0] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[self.segmentedControl setBackgroundImage:[[UIImage imageNamed:@"btn_selected.png"]  stretchableImageWithLeftCapWidth:25 topCapHeight:0] forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
[self.segmentedControl setDividerImage:[UIImage imageNamed:@"nn.png"] forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[self.segmentedControl setDividerImage:[UIImage imageNamed:@"sn.png"] forLeftSegmentState:UIControlStateSelected rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[self.segmentedControl setDividerImage:[UIImage imageNamed:@"ns.png"] forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
- (UISegmentedControl *) customSegmentedControl {
    UISegmentedControl *segmentedControl = [ [ [UISegmentedControl alloc] init] autorelease];

    [segmentedControl setBackgroundImage: [ [UIImage imageNamed: @"btn_normal.png"] stretchableImageWithLeftCapWidth: 25 topCapHeight: 0] forState: UIControlStateNormal barMetrics: UIBarMetricsDefault];
    [segmentedControl setBackgroundImage: [ [UIImage imageNamed: @"btn_selected.png"] stretchableImageWithLeftCapWidth: 25 topCapHeight: 0] forState: UIControlStateSelected barMetrics: UIBarMetricsDefault];
    [segmentedControl setDividerImage: [UIImage imageNamed: @"nn.png"] forLeftSegmentState: UIControlStateNormal rightSegmentState: UIControlStateNormal barMetrics: UIBarMetricsDefault];
    [segmentedControl setDividerImage: [UIImage imageNamed: @"sn.png"] forLeftSegmentState: UIControlStateSelected rightSegmentState: UIControlStateNormal barMetrics: UIBarMetricsDefault];
    [segmentedControl setDividerImage: [UIImage imageNamed: @"ns.png"] forLeftSegmentState: UIControlStateNormal rightSegmentState: UIControlStateSelected barMetrics: UIBarMetricsDefault];

    return segmentedControl;
}