iOS 7设备上的分段控件是否可以显示为iOS 6版本的控件?
我们还没有为接口重新设计做好准备,而新的平板控制与其他用户界面并不相符。如果可能的话,现在最好保留iOS 6风格。
为了澄清,我正在使用iOS 6.1 Base SDK进行编译。我知道这是我问题的“明显”答案,但它不起作用。大多数其他UI元素将通过执行此操作显示iOS 6样式,但与UIAlertView
和UIActionSheet
类似,UISegmentedControl
不会。但是,与UIAlertView
和UIActionSheet
不同,UISegmentedControls
感觉不像是“系统”项目;它们应该能够以iOS 6模式显示。
编辑:我认为如果我最终包含一张图片(可能应该从一开始就做到这一点)会有所帮助。但是,我提供的答案确实解决了这个问题。此外,回想起来,看起来可能毕竟是iOS 6风格,它只是显示错误,看起来像iOS 7风格。
答案 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
外观:
我确实认为这是一个错误,如果没有针对代码中创建的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)
你可以:
答案 6 :(得分:0)
有可能吗?不是......
您可以制作自己的自定义分段控件。
或者您可以使用UIAppearance
代理来自定义带图像的分段控件,但是您有责任让它看起来像是在iOS 6上。
答案 7 :(得分:0)
是的,如果您自己重新创建控件,则可以。创建一个假的分段控件,它看起来像一个一样。
答案 8 :(得分:0)
在我的应用中,我将Segmented控件设置为“Bar”样式。它在我的ios7 iphone5上呈现ios6风格(哇,5,6,7)。但是,无论视图有多宽,都会剪切段内的文本并添加三个点“...”。 所以ios7中的ios6分段控件渲染看起来真的很麻烦