在iOS 7中使用iOS 6 Style Segmented Control?

时间:2013-09-19 16:19:31

标签: ios ios6 uisegmentedcontrol ios7

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

我们还没有为接口重新设计做好准备,而新的平板控制与其他用户界面并不相符。如果可能的话,现在最好保留iOS 6风格。

为了澄清,我正在使用iOS 6.1 Base SDK进行编译。我知道这是我问题的“明显”答案,但它不起作用。大多数其他UI元素将通过执行此操作显示iOS 6样式,但与UIAlertViewUIActionSheet类似,UISegmentedControl不会。但是,与UIAlertViewUIActionSheet不同,UISegmentedControls感觉不像是“系统”项目;它们应该能够以iOS 6模式显示。

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

enter image description here

9 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分: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];
    }
}

答案 2 :(得分:5)

我今天刚遇到这个问题。我正在进行更新的应用程序已经很老了,仍然使用xib文件,所以我不知道这是否适用于故事板。正如上面其他人所建议的那样,你仍然需要使用iOS 6.1 SDK,但仅凭这一点还不够。执行以下步骤后,我能够恢复旧的UISegmentedControl外观:

  1. 打开有问题的界面构建器文档
  2. 转到文件检查器(第一个检查器选项卡;有一个文档图标)
  3. 在“Interface Builder Document”部分下,将“Opens in”更改为Xcode 4.6
  4. 我确实认为这是一个错误,如果没有针对代码中创建的UISegmentedControl实例的解决方法,我也不会感到惊讶。我猜这与iOS 7中segmentedControlStyle属性的弃用有关(参见https://developer.apple.com/library/ios/documentation/uikit/reference/UISegmentedControl_Class/DeprecationAppendix/AppendixADeprecatedAPI.html#//apple_ref/occ/instp/UISegmentedControl/segmentedControlStyle)。

    希望这可以帮助那些人。

答案 3 :(得分:2)

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

答案 4 :(得分:2)

如果您在任何UISegmentedControl片段上使用图片,则需要添加一些代码才能在iOS 7上正确设置这些图片,否则它们将被用作模板图像,所选片段将成为细分市场的背景。

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

答案 5 :(得分:0)

你可以:

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

答案 6 :(得分:0)

有可能吗?不是......

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

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

答案 7 :(得分:0)

是的,如果您自己重新创建控件,则可以。创建一个假的分段控件,它看起来像一个一样。

答案 8 :(得分:0)

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