iOS 6/7 Deltas:仅适用于子视图?

Posted

技术标签:

【中文标题】iOS 6/7 Deltas:仅适用于子视图?【英文标题】:iOS 6/7 Deltas: Only working for subviews? 【发布时间】:2013-10-07 21:00:51 【问题描述】:

我为 ios 5 和 6 设计了我的 iPhone 应用程序。现在我希望它支持 iOS 7 以及两个旧版本。像许多开发人员一样,我一直在为状态栏与我的视图重叠而苦苦挣扎,我知道有no way to preserve the old status bar style in iOS 7。

但 *** 上的许多帖子建议使用 iOS 6/7 Deltas,它可以通过新 SDK 在 Xcode 中设置:

我已经尝试过了,但我发现当我将这些值应用到视图控制器的根视图时没有任何反应。这些 Delta 仅对根视图中包含的所有子视图有影响。

为什么 Delta 不适用于根视图? 有没有办法让它工作? (我不想在所有视图控制器中的所有 UI 元素中添加 Delta。)

【问题讨论】:

使用全屏是ios7的规范,所以根视图会一直全屏。因此,您必须为所有组件添加增量。或者您可以这样做-添加一个具有增量的新视图并将所有其他组件放入其中并将该视图放入您的 rootView 【参考方案1】:

我发现这项工作对我来说很好。

 -(void)viewWillLayoutSubviews

    if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) 
   
    // Load resources for iOS 6.1 or earlier
    if(IS_IPhone5)
    
        self.view.frame = CGRectMake(0.0, -64.0, 320.0, 568.0);
    
    else
    
      self.view.frame = CGRectMake(0.0, -64.0, 320.0, 480.0);  
     
   

 

【讨论】:

【参考方案2】:

根据您的问题,我认为您似乎厌倦了为各个子视图设置增量值。但我认为这很容易。只需选择所有子视图:

您可以一次性从尺寸检查器中为所有子视图添加相同的增量值...就这么简单!!

【讨论】:

【参考方案3】:

让我帮你,其实很简单。您需要按照以下步骤操作:

在文件检查器中为目标 xib 设置 view As iOS 7

1. 使用 Interface Builder 将所有视图放入具有框架 (0,20, rootViewWidth, rootViewHeight) 的容器视图中。注意:无需为容器视图内的任何视图设置增量。 容器视图的增量为:delta-Y =-20, delta-height=20 否则为零

2.在 xib 中再放一个 (0,0,rootViewWidth,20) 的视图(命名为 statusBarBackgroudView)。 statusBarBackgroudView 的增量为:delta-Y = -20 否则为零。

为 statusBarBackgroudView 赋予所需的背景颜色,该颜色将显示在 iOS 7 的状态栏下方,而在 iOS 6 中,它将简单地转换为 Y = -20,因此将不可见。

XIB 中的视图层次结构应如下所示:

Root View
 -Container View
   -your subviews
 -Status Bar Background View

【讨论】:

我很惊讶这个答案没有得到更多的支持。简洁明了的解释并按照预期的方式使用 Xcode 功能,无需在代码中添加额外的 IF 语句。 (也感谢“以 iOS7 方式查看”提示 - 这是我缺少的部分。)【参考方案4】:

这个代码段为我解决了这个问题。我已将它放入BaseViewController,这是项目中所有UIViewController 的超类。我认为添加这个简单的代码而不是修改每个 xib 文件上的增量更可行。源自 bhavya kothari 的回答:

- (void)viewWillLayoutSubviews

    [self fixStatusBarOffsetIfiOS6];
    [super viewWillLayoutSubviews];


- (void)fixStatusBarOffsetIfiOS6

    if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1)
        self.view.frame = CGRectMake(0.0, -20.0, CGRectGetWidth(self.view.frame), CGRectGetHeight(self.view.frame) + 20);
    

【讨论】:

【参考方案5】:

如果(IS_Ios6)

    if (IS_IPHONE_4) 
        self.view.frame = CGRectMake(0, 0, 320, 480);
     else if (IS_IPAD)
        self.view.frame = CGRectMake(0, 0, 768, 1024);
    
    self.wantsFullScreenLayout = YES;

将此代码放入 viewDidLoad...

【讨论】:

以上是关于iOS 6/7 Deltas:仅适用于子视图?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 6/7 deltas 使后台容器消失

iOS:在 iOS 7 和 iOS 8 上将约束应用于子视图的自动布局差异

iOS:仅将仿射变换应用于子视图

如何限制 UIScrollViewDelegate 仅适用于 UIViewController 中的一个视图

停止仿射变换应用于子视图

Oracle 查询优化器是不是将*** where 子句应用于子查询或视图?