【问题标题】:UISegmentedControl rendered completely wrong when used with images and rendered correctly when used with textUISegmentedControl 与图像一起使用时呈现完全错误,与文本一起使用时呈现正确
【发布时间】:2013-10-16 23:18:04
【问题描述】:

我为 iOS 6 编译了这个应用程序。这是从 iOS 4.3 升级的代码,在那里运行良好。

创建分段控件后,其图标只是alpha通道,控件是透明的。

这就是我创建它的方式

// images is a NSArray of images. I have confirmed. 
// All images are OK and are loading fine on this array. 
// Images have alpha channel. They are basically solid
// rounded icons with shadows surrounded by transparent pixels
UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:images];
[segmentedControl addTarget:self action:selector(change:)
           forControlEvents:UIControlEventValueChanged];
segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;

这就是我对控件的看法。请注意与 Alpha 通道上的图标阴影对应的模糊蓝色右边框。此外,另一个问题是它是蓝色的。我从未在此控件上调整过任何蓝色。这在 iOS 4.3 上运行良好。

有什么线索吗?


编辑:一旦我用文本替换图像,分段控制就会正确渲染:不透明且永远没有蓝色。现在WTF等级提高了。

我创建了一个示例项目,其中包含 3 个红色图像,对于某些 WTF 因素显示为蓝色。在此处下载项目:http://www.fileswap.com/dl/RVf7UuwKhf/

【问题讨论】:

  • 很抱歉,您是在 xcode 5 或更早版本上运行它吗?
  • Xcode 5. 我已经上传了一个显示问题的示例项目...这里:fileswap.com/dl/RVf7UuwKhf
  • 您的项目似乎正在运行fine here。话虽这么说,您的问题似乎是图像由于某种原因被 iOS7 视为模板,因此是蓝色(这是您的全局 tint 颜色)
  • 看到了吗?它不适合你。你看到的是蓝色的字母。看图像。它们是红色的。我在 Xcode 4 中尝试过。同样的问题,但我认为 Xcode 5 改变了项目,现在 Xcode 4 也错误地呈现它。
  • 我在 Xcode 4.63 上打开了原始文件。工具栏看起来很好,很痛。

标签: iphone ipad ios6


【解决方案1】:

iOS7 引入了一个新的图像选项 (UIImageRenderingMode)。此选项的作用是指定是否将图像视为模板。

如果图像处于模板“模式”,则对非透明部分进行着色(tint 的默认颜色是全局颜色,以匹配您的应用程序的所有颜色,从而为整体控件提供一致的主题)。

解决方案只是将您的图像指定为original 而不是template,如下所示:

UIImage *a = [[UIImage imageNamed:@"ITEAM-icon157.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
UIImage *b = [[UIImage imageNamed:@"ITEAM-icon159.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
UIImage *c = [[UIImage imageNamed:@"ITEAM-icon160.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

当然,如果您只是想要一个带有红色图标的红色segmentedControl,您可以像这样设置控件的tintColor(无需在图像上指定渲染模式):

segmentedControl.tintColor = [UIColor redColor];

最后一点,还有第三个选项UIImageRenderingModeAutomatic,根据使用图像的上下文,图像会自动被视为模板/正常。虽然 Apple 没有说明上下文是如何确定的,但我希望它选择 template 用于控件,normal 用于 UIImageViews 等。

您可以找到relevant documentation here

【讨论】:

  • 你在逗我吗???!?!?!?!?!这就是为什么我讨厌所有苹果文档的原因...应该将对此的引用添加到您定义要在分段控制器上使用的图像的部分。我喜欢 Apple,因为默认是模板,只是为了惹恼程序员。但是我在这里看到了一个问题:这个应用程序是为 6.0 编译的。所以我必须有两种加载图像的方法,一种用于 iOS 6,另一种用于 iOS 7....感谢 Apple。
  • @RubberDuck 是的,没错,如果你想支持以前的版本,恐怕你必须检查 iOS 版本并相应地分叉。
  • 使用您的答案,图像现在是正确的,但工具栏仍然是透明的,带有蓝色分隔线(看在上帝的份上,Apple)。为分段控件添加色调和背景颜色解决了这两个问题......这让我想:iOS 7 不尊重以前版本的其他 API 吗?咕咕咕!
  • 是的,这是预期的行为,因为 iOS7 上的 UISegmentedControl 默认情况下具有透明背景。很高兴你解决了你的问题:)
  • 问题是 UIRenderingMode 在 iOS6 上不可用,它是一个新的 API。 This guide 可以帮助您将 UI 过渡到 iOS7
猜你喜欢
  • 2018-01-18
  • 1970-01-01
  • 2017-06-09
  • 1970-01-01
  • 2016-10-14
  • 2011-09-07
  • 2021-10-02
  • 1970-01-01
  • 2016-10-15
相关资源
最近更新 更多