【问题标题】:Use iOS 6 Style Segmented Control in iOS 7?在 iOS 7 中使用 iOS 6 样式分段控制?
【发布时间】:2013-09-24 20:29:41
【问题描述】:

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

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

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

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

【问题讨论】:

  • 不能用iOS 6 SDK编译吗?
  • 你会这么认为,但这不起作用...这确实修复了其他 iOS 7 UI 类型问题,但不修复分段控件。不知道为什么它不起作用。
  • 听起来像一个错误。你应该在几乎所有东西上都获得 iOS 6 的外观——警报视图是一个例外,但分段控件不应该是这样。 bugreport.apple.com
  • 你可能是对的。我会继续并将其报告为错误。它看起来绝对像是一个应该保留其 iOS 6 风格的 UI 元素。

标签: ios ios6 uisegmentedcontrol ios7


【解决方案1】:

要修复使用 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];
    }
}

【讨论】:

  • 很好的修复...就像一个魅力。也用它来改变我们的分段控件的大小
  • 您能否分享您的代码如何实现调整段控件的大小?当我在- (void)viewDidLoad 中尝试这个时,没有任何变化。我也尝试在initWithNibName 中做到这一点,但没有任何运气。
  • 新的分段控件的高度降低了。我没有固定高度,尽管这可能是可能的。作为永久性修复,我用引导按钮 github.com/katzlbt/iOSBootstrapButton 完全替换了控件
  • 这只是删除 XCode 5/SDK 7 上的文本标签。
【解决方案2】:

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

  1. 打开有问题的界面构建器文档
  2. 转到文件检查器(第一个检查器选项卡;有一个文档图标)
  3. 在“Interface Builder Document”部分下,将“Opens in”更改为 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的最佳解决方案!
【解决方案3】:

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

【讨论】:

  • 我认为这一直是问题所在:它太有问题/变色了,我还以为是 7 控制...
  • 我的应用程序中有几个“条形”分段控件,我们也有同样的问题 - 颜色很好,但标签被截断为 D... 代表 Day 和 L...即使段中有足够的宽度,也适用于 List。每次选择更改时都尝试重新分配文本,但这并不能解决问题。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      这就是我最终做的:

      - (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。
      • 哈哈谢谢。我更新了我原来的帖子,包括一张我遇到的问题的图片,仅供参考....
      • 前几天正在寻找这个,但无法让它工作。今天发现了这个,“wham bam 谢谢你,女士”。它就像一个魅力。
      • 这是针对某些 6.x SDK 消失的属性的解决方法。在 SDK 7 上,所发生的只是蓝色略有不同。
      • 那(虽然不错)并不能解决问题!你只是得到一个(更好的)segmentedControl,但没有什么比(漂亮的)iOS6 segmentedControl 更好的灰色和蓝色图像。至少有没有办法将-not selected-segments背景更改为另一种颜色(如iOS6的灰色)?
      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

        有可能吗?不是真的……

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

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

        【讨论】:

        • 我想这只是猜测,但您会将其归类为错误还是功能?据我所知,所有其他非系统 UI 元素都可以在 iOS 6 模式下显示,而 UISegmentedControl 显然不能......看起来很奇怪。
        • 就是这样。标准 UI 元素按照 Apple 在每个系统版本上的预期显示。一旦你用 Xcode 5 编译你的应用程序,那么这些系统元素就会变成 iOS 7 或 6,这取决于它们运行的​​系统。使用 Xcode 4,您可以使用 iOS 6 SDK 编译并安装在 iOS 7 设备上,然后标准 UI 元素将保持在 6 上。但 Apple 很快就会像往常一样拒绝使用旧 Xcode 版本提交的应用程序。
        • 不过,您也可以在 Xcode 5 上使用 iOS 6.1 Base SDK 编译应用程序。您只需遵循以下说明:stackoverflow.com/questions/18423896/…。我抱怨的是 UISegmentedControl 无法在 iOS 7 上正确显示,即使使用 iOS 6.1 Base SDK 编译也是如此。但是,所有其他 UI 元素都可以正常显示。
        • 也许然后放一些屏幕截图来说明为什么它对你来说不正常。
        【解决方案9】:

        你可以:

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

        【讨论】:

        • 查看有关问题的 cmets — 显然分段控件是兼容模式事物的一个例外。自定义图像可能是目前唯一的解决方案。
        • 是的,我正在为 iOS 6 进行编译,但无论出于何种原因,UISegmentedControl 仍然出现在 iOS 7 样式中。
        猜你喜欢
        • 2014-03-05
        • 2012-09-28
        • 2013-10-06
        • 2012-09-22
        • 1970-01-01
        • 1970-01-01
        • 2015-09-05
        • 2013-08-20
        相关资源
        最近更新 更多