【问题标题】:UISegmentedControl segment order issueUISegmentedControl 段顺序问题
【发布时间】:2015-05-06 17:53:10
【问题描述】:

我正在使用以下代码来设置 UISegmentedControl 中每个段的颜色。

for (int i = 0; i < [self.controlStatus numberOfSegments]; i++)
    {
        NSArray *ar=self.controlStatus.subviews;

        if ([[self.controlStatus titleForSegmentAtIndex:i] isEqualToString:@"ON"])
        {
            [[self.controlStatus.subviews objectAtIndex:i] setTintColor:[UIColor greenColor]];
        }
        else if ([[self.controlStatus titleForSegmentAtIndex:i] isEqualToString:@"OFF"])
        {
            [[self.controlStatus.subviews objectAtIndex:i] setTintColor:[UIColor orangeColor]];
        }
        else if ([[self.controlStatus titleForSegmentAtIndex:i] isEqualToString:@"HIDE"])
        {
            [[self.controlStatus.subviews objectAtIndex:i] setTintColor:[UIColor redColor]];
        }
        }
    }

但我没有在相应的细分中获得所需的颜色。有时颜色如下:
第一段 - 绿色
第二段 - 橙色
第三段 - 红色

但是在某个阶段,当我导航到其他页面并返回时,颜色会发生变化:
第一段 - 红色
第二段 - 橙色
第三段 - 绿色

谁能告诉我这里发生了什么。

【问题讨论】:

  • 你搞乱了分段控件的私有子视图结构。这总是一个坏主意。您的代码假定子视图与段的顺序相同。错误的假设。
  • 你能给我一些建议吗?
  • 为任何可能在未来寻找答案的人留下评论。这是一种非常肮脏的方式,但是如果您真的必须这样做:我所做的是,在第一次初始化视图控制器时,以正确的顺序将子视图保存在我的数组中。每次您选择另一个分段时,分段控件的子视图都会随机播放,但在您的数组中,它们会以正确的顺序保存。然后您可以操作背景颜色。

标签: ios objective-c uisegmentedcontrol


【解决方案1】:

UISegmentedControl 上没有公共方法可以单独更改每个段的背景颜色。

而且你不能轻易使用图片,因为一个片段可以有图片或标题,但不能同时有。

您可以通过在带有圆角和边框的 UIView 容器中使用矩形 UIButtons 来恢复制作自己的分段控件:

- (void)setBorderWidth:(CGFloat)_borderWidth color:(UIColor *)_borderColor cornerRadius:(CGFloat)_cornerRadius
{
    CALayer *layer = self.layer;

    layer.borderWidth = _borderWidth;
    layer.borderColor = _borderColor.CGColor;
    layer.cornerRadius = _cornerRadius;
    layer.masksToBounds = (_cornerRadius > 0.0);
}

【讨论】:

    【解决方案2】:

    我找到了解决办法。它会满足我的需要..

        if(Status==0)
        {
            [self.controlStatus setSelectedSegmentIndex:0];
            [self.controlStatus setEnabled:FALSE forSegmentAtIndex:1];
            for (int i = 0; i < [self.controlStatus numberOfSegments]; i++)
            {
                if ([[self.controlStatus.subviews objectAtIndex:i] isSelected])
                {
                    [[self.controlStatus.subviews objectAtIndex:i] setTintColor:[UIColor greenColor]];
                }
            }
        }
        else if(Status==1)
        {
            [self.controlStatus setSelectedSegmentIndex:1];
            for (int i = 0; i < [self.controlStatus numberOfSegments]; i++)
            {
                if ([[self.controlStatus.subviews objectAtIndex:i] isSelected])
                {
                    [[self.controlStatus.subviews objectAtIndex:i] setTintColor:[UIColor orangeColor]];
                }
            }
        }
        else if(Status==2)
        {
            [self.controlStatus setSelectedSegmentIndex:2];
            for (int i = 0; i < [self.controlStatus numberOfSegments]; i++)
            {
                if ([[self.controlStatus.subviews objectAtIndex:i] isSelected])
                {
                    [[self.controlStatus.subviews objectAtIndex:i] setTintColor:[UIColor redColor]];
                }
            }
    
        }
    

    我已经在我想要设置SelectedSegmentIndex 的地方编写了这段代码。

    【讨论】:

    • 这段代码仍然在挖掘控件的私有和未记录的子视图。这样的代码很脆弱,很容易在下一次 iOS 更新时停止工作或崩溃。
    猜你喜欢
    • 2014-07-13
    • 1970-01-01
    • 2013-09-24
    • 2010-10-28
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 2019-10-05
    • 2021-11-24
    相关资源
    最近更新 更多