当我为所有状态设置了背景图像时,为什么我的UISegmentControl段在iOS 8中高亮显示?

当我为所有状态设置了背景图像时,为什么我的UISegmentControl段在iOS 8中高亮显示?,ios,ios8,uisegmentedcontrol,Ios,Ios8,Uisegmentedcontrol,在iOS 6/7中,我将UISegmentedControl与背景图像一起使用,以创建如下效果: 我通过为每个标准状态的UISegmentedControl设置背景图像来实现这一点,如下所示: UIImage *segmentedControlBackgroundImage = [UIImage imageNamed:@"profileSegmentedControlBackground"]; UIImage *segmentedControlBackgroundSelectedImage =

在iOS 6/7中,我将
UISegmentedControl
与背景图像一起使用,以创建如下效果:

我通过为每个标准状态的
UISegmentedControl
设置背景图像来实现这一点,如下所示:

UIImage *segmentedControlBackgroundImage = [UIImage imageNamed:@"profileSegmentedControlBackground"];
UIImage *segmentedControlBackgroundSelectedImage = [UIImage imageNamed:@"profileSegmentedControlBackgroundSelected"];

[self.segmentedControl setBackgroundImage:segmentedControlBackgroundImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[self.segmentedControl setBackgroundImage:segmentedControlBackgroundImage forState:UIControlStateDisabled barMetrics:UIBarMetricsDefault];
[self.segmentedControl setBackgroundImage:segmentedControlBackgroundSelectedImage forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault];
[self.segmentedControl setBackgroundImage:segmentedControlBackgroundSelectedImage forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
当一段变为“选择”或高亮显示时,它下面有一个漂亮的蓝色条,我设置文本属性以将文本颜色更改为蓝色。有一些额外的代码用于分隔符,但我认为这是无关的,所以我省略了它

我的问题是,在iOS 8中,有几个操作会导致片段的背景变灰,看起来很糟糕;一个是当您更改选择时,您点击的单元格将变为灰色,直到转换完成;另一个是,如果您点击并按住已选择的线段,它将变为灰色。两者看起来一模一样,可以在下面看到

一些额外的可能相关信息:

  • 分段控件的
    tintColor
    是清晰的
  • 我不是子类化
    UISegmentedControl
  • 我没有使用其外观代理更改
    UISegmentedControl
    的任何属性
  • 我使用1点宽的图像作为背景图像,并且
    ui分段控制
    自动确定capinset并平铺图像

选择已选择的段时,段变灰的原因是分段控件缺少选中并同时高亮显示的状态

在您的情况下,请拨打:

[self.segmentedControl setBackgroundImage:segmentedControlBackgroundSelectedImage forState:UIControlStateSelected | UIControlStateHighlighted barMetrics:UIBarMetricsDefault];
我们应该解决这个问题

更改选择时,所点击的单元格将变为灰色,直到 过渡完成


我无法复制这一个,但这可能会解决这两个问题。

以防万一,在Swift中是(Swift 4的UPD)

segmentedControl.setBackgroundImage(图像,forState:.选定,barMetrics:.默认值)

segmentedControl.setBackgroundImage(图像,forState:.高亮显示,barMetrics:.默认)

我也发现了这一点。你有没有找到解决问题的办法?没有。我所能做的最好的事情就是确保在更换标签后,主线程上几乎没有发生什么变化,这样它就可以在尽可能短的时间内显示出错误的颜色。太棒了!是的,它确实解决了这两个问题。谢谢你的帮助。多么奇怪的API啊。我也在自定义分割图像,所以这将使自定义所需的行数增加一倍。我从来没有想到状态可以一起屏蔽。谢谢你,苹果医生!非常感谢。人们怎么知道这样的事情?医生帮不了忙。@DaniSpringer因为是Swift 2?尝试使用启动枚举选项lowercase@DaniSpringer是的,我没有研究过这个问题,但是传递数组似乎不再有效了。对所选的
和突出显示的
尝试两个单独的语句。我做到了。实际上,我创建了一个for循环,为项目创建了一个数组,并在循环中访问它们。感谢为我工作的是在单行上设置(选中、突出显示、正常)。然后像这样选择并高亮显示设置<代码>self.setBackgroundImage(backgroundImage,for:.normal,barMetrics:.default)self.setBackgroundImage(backgroundImage,for:.selected,barMetrics:.default)self.setBackgroundImage(backgroundImage,for:[.selected,.highlighted],barMetrics:.default)