【问题标题】:UISegmentedControl segment width of is not set when the background image is setUISegmentedControl 设置背景图片时不设置段宽
【发布时间】:2012-05-14 06:06:25
【问题描述】:

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

这是我的代码:

[[UISegmentedControl appearance] setBackgroundImage:[[UIImage imageNamed:@"btn_normal.png"] stretchableImageWithLeftCapWidth:25 topCapHeight:0] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[[UISegmentedControl appearance] setBackgroundImage:[[UIImage imageNamed:@"btn_selected.png"]  stretchableImageWithLeftCapWidth:25 topCapHeight:0] forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
[[UISegmentedControl appearance] setDividerImage:[UIImage imageNamed:@"nn.png"] forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[[UISegmentedControl appearance] setDividerImage:[UIImage imageNamed:@"sn.png"] forLeftSegmentState:UIControlStateSelected rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[[UISegmentedControl appearance] setDividerImage:[UIImage imageNamed:@"ns.png"] forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
[self.segmentedControl setContentMode:UIViewContentModeScaleToFill];
[self.segmentedControl setWidth:100.0 forSegmentAtIndex:0];
[self.segmentedControl setWidth:100.0 forSegmentAtIndex:4];

这样,我的所有段都会自动显示为相等的宽度。
当我在上面注释掉所有内容时

[self.segmentedControl setContentMode:UIViewContentModeScaleToFill];
[self.segmentedControl setWidth:100.0 forSegmentAtIndex:0];
[self.segmentedControl setWidth:100.0 forSegmentAtIndex:4];

尺寸设置正确。
这是我的问题:如何为带有背景图像的片段设置大小?
我是 cocoa-touch 和 Objective-c 的新手,所以我可能会遗漏一些东西...
你能帮忙吗?

【问题讨论】:

    标签: objective-c ios cocoa-touch ios5 uisegmentedcontrol


    【解决方案1】:

    我认为当您使用 [UISegmentedControl appearance] 代理时,它会覆盖 "setWidth:forSegmentAtIndex:" 方法值。所以可能的解决方案:

    1)

    [[UISegmentedControl appearance] setContentMode:UIViewContentModeScaleToFill];
    [[UISegmentedControl appearance] setWidth:100.0 forSegmentAtIndex:0];
    [[UISegmentedControl appearance] setWidth:100.0 forSegmentAtIndex:4];
    

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

    2)

    [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;
    }
    

    【讨论】:

    • 谢谢你,伊戈尔!但我的问题是关于细分市场的大小。我通过编写自定义控件解决了这个问题。
    • @voiger,伊戈尔是对的。通过在实际实例上而不是在外观实例上设置背景图像,可以在单个段上设置宽度。只有当您通过外观应用背景图像时,它才会忽略指定的宽度。这似乎已在 iOS 6.0 中修复,因此目前仅在 iOS 5.0 上出现问题。
    【解决方案2】:

    我通过编写自定义控件解决了这个问题,基于这个http://idevrecipes.com/2010/12/11/custom-segmented-controls/

    【讨论】:

      猜你喜欢
      • 2012-05-31
      • 2023-03-25
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      • 2020-11-21
      • 2015-05-09
      • 2012-03-07
      • 2020-07-03
      相关资源
      最近更新 更多