在iOS 7中如何使用iOS 6风格的分段控件?

15
在iOS 7设备上,能否将分段控件显示为iOS 6版本的样式?
我们还没有准备好进行界面重新设计,新的扁平化控件与我们UI的其余部分不协调。如果可能的话,最好现在保留iOS 6的样式。
澄清一下,我正在使用iOS 6.1基础SDK进行编译。我知道这是我的问题的“显而易见”的答案,但它并不起作用。大多数其他UI元素都会通过这样做以iOS 6样式显示,但像UIAlertView和UIActionSheet这样的元素与UISegmentedControl不同。然而,与UIAlertView和UIActionSheet不同,UISegmentedControls并不感觉像是一个“系统”项目;它们应该能够以iOS 6模式显示。
编辑:我认为如果我最终包含了一张图片,这将是有帮助的(可能从一开始就应该这样做)。但是,我提供的答案确实解决了这个问题。此外,回想起来,它看起来像这可能是iOS 6样式,只是显示得非常不正常,看起来像iOS 7样式。

你不能只使用iOS 6 SDK来编译吗? - David Rönnqvist
2
你可能会这样想,但那行不通......虽然这确实可以解决其他iOS 7 UI类型的问题,但不能解决分段控件的问题。为什么它不起作用我也不知道。 - MikeS
听起来像是一个 bug。你应该在几乎所有的地方都能看到 iOS 6 的外观,警告视图是一个例外,但分段控件不应该是。http://bugreport.apple.com - Noah Witherspoon
你可能是对的。我会继续将其报告为错误。它肯定看起来像一个应该保留其iOS 6风格的UI元素。 - MikeS
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];
}

这真是太棒了。我的分段控制器现在看起来就像iOS6一样。 - Ben Clayton
哈哈谢谢。我更新了原帖,加入了一个问题图片作为参考... - MikeS
1
前几天一直在寻找这个功能,但是一直无法让它正常工作。今天终于找到了解决方法,简直是信手拈来,非常好用。 - Totumus Maximus
这是一种解决某些6.x SDK中属性消失的方法。在SDK 7上,所有发生的事情只是蓝色略有不同的阴影。 - Henrik Erlandsson
那个(虽然不错)并没有解决问题!你只是得到了一个(更好的)分段控件,但它并不像(美丽的)iOS6分段控件那样带有漂亮的灰色和蓝色图像。至少有没有一种方法可以将“未选择”的分段背景更改为另一种颜色(比如iOS6的灰色)? - Gik
显示剩余4条评论

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];
    }
}

1
不错的修复...运行得很好。我们还使用它来更改分段控件的大小。 - MobileVet
你能分享一下你是如何调整分段控件大小的代码吗?当我在 - (void)viewDidLoad 中尝试时,什么都没有改变。我也尝试在 initWithNibName 中实现,但是没有成功。 - Houman
新的分段控件高度缩小了。虽然可能可以调整高度,但我没有这样做。作为永久性的解决方案,我完全用bootstrap按钮替换了控件 http://github.com/katzlbt/iOSBootstrapButton - cat
这只是在XCode 5/SDK 7上删除文本标签。 - Henrik Erlandsson

5
我今天遇到了这个问题。我正在更新的应用程序非常古老,仍然使用xib文件,因此我不知道它是否适用于storyboards。正如其他人在上面建议的那样,您仍然需要使用iOS 6.1 SDK,但这本身是不够的。执行以下步骤后,我成功地恢复了旧的UISegmentedControl外观:
  1. 打开相关的界面构建器文档
  2. 进入文件检查器(第一个检查器选项卡;有一个文档图标)
  3. 在“界面构建器文档”部分下,将“打开方式”更改为Xcode 4.6
我认为这是一个错误,如果没有解决方案,对于在代码中创建的UISegmentedControl实例也不会感到惊讶。我猜这与iOS 7中segmentedControlStyle属性的弃用有些相关(参见https://developer.apple.com/library/ios/documentation/uikit/reference/UISegmentedControl_Class/DeprecationAppendix/AppendixADeprecatedAPI.html#//apple_ref/occ/instp/UISegmentedControl/segmentedControlStyle)。希望这能帮助到某个人。

这是保持iOS 7中的iOS 6 UI的最佳解决方案! - fumoboy007

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

2
如果您在任何UISegmentedControl段上使用图像,则需要添加一些代码来在iOS 7上正确设置它们,否则它们将被用作模板图像,并且选定的段将成为该段背景的切口。
在iOS 7下,UISegmentedControl解释其图像为UIImageRenderingModeAlwaysTemplate渲染模式,除非另有规定。我必须对每个段的图像使用-[UIImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]才能在iOS 7上实现以前的行为。

0

你可以选择以下两种方式:

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

3
看一下问题评论,显然分段控件是兼容模式的例外。现在可能只有使用自定义图片才是唯一的解决方案。 - Noah Witherspoon
是的,我正在编译iOS 6版本,但由于某种原因,UISegmentedControl仍然以iOS 7的样式显示。 - MikeS

0

是的,如果您自己重新创建控件,则可以实现。创建一个看起来和工作方式类似的虚假分段控件。


0
在我的应用程序中,我已将分段控件设置为“条形”样式。它在我的ios7 iphone5上以ios6样式呈现(哇,5,6,7)。然而,段内的文本被剪切并添加了三个点“...”,无论视图有多宽。 因此,ios7中呈现的ios6分段控件似乎真的很有问题。

我认为这一直是问题所在:它非常有bug/颜色失真,我以为是7号控件的问题... - MikeS
我们的应用程序中有几个“bar”分段控件,我们遇到了同样的问题 - 颜色没问题,但标签被截断为D...和L...,即使在分段控件中有足够的宽度。尝试每次更改选择时重新分配文本,但这并不能解决问题。 - Bill

-1

这可能吗?不太可能...

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

或者你可以使用UIAppearance代理来使用图片自定义你的分段控件,但是让它看起来像iOS 6上的控件就需要你自己来完成了。


这只是猜测,那么你会将其归类为错误还是特性呢?据我所知,所有其他非系统UI元素都可以在iOS 6模式下显示,而UISegmentedControl显然不能...看起来很奇怪。 - MikeS
这就是现状。标准的UI元素在每个系统版本上都按照苹果的意图出现。一旦你使用Xcode 5编译你的应用程序,那么这些系统元素将根据它们运行的系统而变成iOS 7或6。使用Xcode 4,你可以使用iOS 6 SDK进行编译并安装到iOS 7设备上,然后标准的UI元素将保持在6上。但是,苹果很快就会拒绝使用旧版Xcode提交的应用程序,就像他们一直做的那样。 - Daniel
你也可以在Xcode 5上使用iOS 6.1 Base SDK编译应用程序,只需要按照这些说明操作:https://dev59.com/ImMl5IYBdhLWcg3wa2bV。我所抱怨的是,即使使用iOS 6.1 Base SDK编译,UISegmentedControl在iOS 7上仍然无法正常显示。但是,所有其他UI元素都能够正常显示。 - MikeS
也许你可以放一些截图,解释为什么它对你来说看起来不正常。 - Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接