15

是否可以让 iOS 7 设备上的分段控件显示为 iOS 6 版本的控件?

我们真的还没有准备好重新设计界面,新的平面控件与我们 UI 的其余部分不兼容。如果可能的话,最好暂时保持 iOS 6 的风格。

为了澄清,我正在使用 iOS 6.1 Base SDK 进行编译。我知道这是对我的问题的“明显”答案,但它不起作用。通过这样做,大多数其他 UI 元素将显示为 iOS 6 样式,但像UIAlertViewand一样UIActionSheetUISegmentedControl不会。但是,与UIAlertViewand不同的是UIActionSheet,它不像UISegmentedControls是一个“系统”项;他们应该能够在 iOS 6 模式下显示。

编辑:我认为如果我最终包含一张图片会有所帮助(可能应该从一开始就这样做)。但是,我提供的答案确实解决了这个问题。另外,回想起来,这似乎毕竟是 iOS 6 的风格,只是显示错误以至于看起来像 iOS 7 的风格。

在此处输入图像描述

4

9 回答 9

20

通过手动设置所有属性,我设法很好地解决了这个问题,但它并不完美。

这就是我最终做的事情:

- (void)fixSegmentedControlForiOS7
{
    NSInteger deviceVersion = [[UIDevice currentDevice] systemVersion].integerValue;
    if(deviceVersion < 7) // If this is not an iOS 7 device, we do not need to perform these customizations.
        return;

    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIFont boldSystemFontOfSize:12], UITextAttributeFont,
                                [UIColor whiteColor], UITextAttributeTextColor,
                                nil];
    [self.segmentedControl setTitleTextAttributes:attributes forState:UIControlStateNormal];
    NSDictionary *highlightedAttributes = [NSDictionary dictionaryWithObject:[UIColor whiteColor] forKey:UITextAttributeTextColor];
    [self.segmentedControl setTitleTextAttributes:highlightedAttributes forState:UIControlStateHighlighted];

    self.segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
    self.segmentedControl.tintColor = [UIColor colorWithRed:49.0 / 256.0 green:148.0 / 256.0 blue:208.0 / 256.0 alpha:1];
}
于 2013-09-19T18:13:07.040 回答
13

要修复使用 InterfaceBuilder 分配的图像,请使用以下代码:

- (void)fixImagesOfSegmentedControlForiOS7
{
    NSInteger deviceVersion = [[UIDevice currentDevice] systemVersion].integerValue;
    if(deviceVersion < 7) // If this is not an iOS 7 device, we do not need to perform these customizations.
        return;

    for(int i=0;i<toSegmentedControl.numberOfSegments;i++)
    {
        UIImage* img = [toSegmentedControl imageForSegmentAtIndex:i];
        UIImage* goodImg = [img imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        // clone image with different rendering mode
        [toSegmentedControl setImage:goodImg forSegmentAtIndex:i];
    }
}
于 2013-09-27T11:47:54.213 回答
5

我今天自己也遇到了这个问题。我正在更新的应用程序很旧,仍然使用 xib 文件,所以我不知道这是否适用于情节提要。正如上面其他人所建议的,您仍然需要使用 iOS 6.1 SDK,但这还不够。执行以下步骤后,我能够恢复旧UISegmentedControl外观:

  1. 打开有问题的界面生成器文档
  2. 转到文件检查器(第一个检查器选项卡;有一个文档图标)
  3. 在“Interface Builder Document”部分下,将“Opens in”更改为 Xcode 4.6

UISegmentedControl我确实相信这是一个错误,如果没有针对在代码中创建的实例的解决方法,我不会感到惊讶。我猜这在某种程度上与segmentedControlStyleiOS 7 中该属性的弃用有关(请参阅https://developer.apple.com/library/ios/documentation/uikit/reference/UISegmentedControl_Class/DeprecationAppendix/AppendixADprecatedAPI.html#//apple_ref /occ/instp/UISegmentedControl/segmentedControlStyle)。

希望这可以帮助那里的人。

于 2013-09-23T21:51:14.860 回答
2

如果您在任何 UISegmentedControl 段上使用图像,则需要添加一些代码以在 iOS 7 上正确设置这些图像,否则它们将用作模板图像,并且所选段将成为段背景的剪切。

iOS 7 下的 UISegmentedControl 将其图像解释为处于渲染模式 UIImageRenderingModeAlwaysTemplate ,除非另有说明。我必须在 iOS 7 的每个段的图像上使用 -[UIImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] 来实现以前的行为。

于 2013-09-20T04:31:21.540 回答
2

如果您从以前版本的 XCode 中保存 iPhoneOS6.1.sdk 文件并将其添加到 Xcode 5 中的相同路径中,则您可以针对 6.1 SDK 构建应用程序,这样当它在 7 上运行时,一切都像 6。 iOS7 SDK 告诉 iOS 尽可能让一切看起来像 iOS7。本质上,您拥有一个 iOS6 应用程序,但使用 XCode 5 构建它。

于 2013-09-19T19:21:36.713 回答
0

你可以:

  • 在您准备好进行一些 UI 更改之前,不要为 iOS7 更新您的应用程序。针对 iOS6 SDK 编译的应用程序将在 iOS7 上以 iOS6 兼容模式运行,并且看起来与在 iOS6 中完全相同。
  • 将自定义背景、分隔符等图像应用到您的分段控件,以模仿它们在 iOS6 中的外观。
于 2013-09-19T16:24:30.817 回答
0

在我的应用程序中,我已将分段控件设置为“条形”样式。它在我的 ios7 iphone5(哇,5,6,7)上以 ios6 样式呈现。但是,无论视图有多宽,段内的文本都会被剪切并添加三个点“...”。所以ios7中的ios6分段控件渲染看起来真的有bug

于 2013-09-23T14:05:44.107 回答
0

是的,如果您自己重新创建控件是可能的。创建一个看起来和工作起来都一样的假分段控件。

于 2013-09-19T16:41:46.880 回答
-1

可能吗?并不真地...

您可以制作自己的自定义分段控件。

或者您可以使用UIAppearance代理来自定义带有图像的分段控件,但您有责任让它看起来像在 iOS 6 上。

于 2013-09-19T16:28:37.017 回答