UISegmentedControl在与图像一起使用时呈现完全错误,并在与文本一起使用时正确呈现

时间:2013-10-16 23:18:04

标签: iphone ipad ios6

我已经为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/

enter image description here

1 个答案:

答案 0 :(得分:4)

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等选择UIImageView

您可以找到relevant documentation here