UISegmentedControl setImage:iOS7中的错误

kev*_*lek 25 cocoa-touch objective-c uisegmentedcontrol ios7

我的应用程序中有一个UISegmentedControl.从iOS7 GM开始,在iOS7设备上运行时,我使用的图像不会显示.其他人有这个问题吗?

这是iOS6.1及更早版本中的样子iOS6的-截图.

这是iOS7中的样子iOS7-截图.

这是代码:

self.theSegmentedControl.frame = CGRectMake(self.theSegmentedControl.frame.origin.x, self.theSegmentedControl.frame.origin.y, 320, 35);
[self.theSegmentedControl setBackgroundImage:[UIImage imageNamed:@"img_toggleInactive"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[self.theSegmentedControl setImage:[UIImage imageNamed:@"btn_onceActive"] forSegmentAtIndex:0];
[self.theSegmentedControl setImage:[UIImage imageNamed:@"btn_recurringInactive"] forSegmentAtIndex:1];
[self.theSegmentedControl setImage:[UIImage imageNamed:@"btn_scheduledInactive"] forSegmentAtIndex:2];
[self.theSegmentedControl setDividerImage:[UIImage imageNamed:@"separator"] forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
Run Code Online (Sandbox Code Playgroud)

有人找到了解决方法吗?

kev*_*lek 61

哇噢!这是解决方法:

//Add clear color to mask any bits of a selection state that the object might show around the images
self.theSegmentedControl.tintColor = [UIColor clearColor];

UIImage *onceActive;
UIImage *recurringActive;
UIImage *scheduledActive;
UIImage *separator;

//Setting imageWithRenderingMode: to imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal for iOS7 is key
if ([UIImage instancesRespondToSelector:@selector(imageWithRenderingMode:)]) {
    onceActive = [[UIImage imageNamed:@"btn_onceActive"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    recurringActive = [[UIImage imageNamed:@"btn_recurringInactive"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    scheduledActive = [[UIImage imageNamed:@"btn_scheduledInactive"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    separator = [[UIImage imageNamed:@"separator"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

}
else {
    onceActive = [UIImage imageNamed:@"btn_onceActive"];
    recurringActive = [UIImage imageNamed:@"btn_recurringInactive"];
    scheduledActive = [UIImage imageNamed:@"btn_scheduledInactive"];
    separator = [UIImage imageNamed:@"separator"];
}


[self.theSegmentedControl setImage:onceActive forSegmentAtIndex:0];
[self.theSegmentedControl setImage:recurringActive forSegmentAtIndex:1];
[self.theSegmentedControl setImage:scheduledActive forSegmentAtIndex:2];
[self.theSegmentedControl setDividerImage:separator forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
Run Code Online (Sandbox Code Playgroud)

  • 没有新方法的代码在iOS6.1中工作并降低并在7中停止.文档或控制台中没有任何指示可以做任何不同的操作.责任的责任不在于我观看所有WWDC视频.我要继续把这个称为bug,谢谢. (25认同)
  • 这不是在其中一个WWDC视频中明确提到的"解决方法",在这种情况下需要做的事情 (2认同)
  • 您是否使用新SDK重新编译代码?文档*清楚地表明:段图标您可以使用图像而不是标题文本作为段.请注意,除非您将其渲染模式明确设置为UIImageRenderingModeAlwaysOriginal,否则段图像将自动呈现为分段控件中的模板图像.有关更多信息,请参阅模板图像(我没有链接到它,因为链接仍然是预发布) (2认同)

Joã*_*nes 17

Xcode 6/iOS 8的更新

现在您可以在Interface builder中执行此操作

只需在资产目录中添加图像文件,并将其设置为"渲染为"原始图像,而不是默认图像

Xcode 5

新的UISegmented控件使用色调颜色使用模板模式为图像着色.您需要将这些图像渲染为原始图像而不是模板.

正如评论中所建议的那样:

UIImage* onceActive = [UIImage imageNamed:@"btn_onceActive"];
if (IOS_7_MACRO)
    onceActive = [onceActive imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
[self.theSegmentedControl setImage:onceActive forSegmentAtIndex:0];
Run Code Online (Sandbox Code Playgroud)

  • 至少对于UISegmentedControl,我没有在IB中看到这个选项:( (2认同)

Him*_*jan 7

使用此代码在iOS 7中使用xCode 5.0在段控制上设置图像

if ([UIImage instancesRespondToSelector:@selector(imageWithRenderingMode:)]) {

    [segmentControl setImage:[[UIImage imageNamed:@"image.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] forSegmentAtIndex:0];

}
else {
    [segmentControl setImage:[UIImage imageNamed:@"image.png"] forSegmentAtIndex:0];
}
Run Code Online (Sandbox Code Playgroud)