【问题标题】:What is the relationship between Storyboard form factor & Active Scheme in Xcode using Autolayout?Xcode 中使用 Autolayout 的 Storyboard 外形尺寸和 Active Scheme 之间有什么关系?
【发布时间】:2013-11-22 01:16:33
【问题描述】:

我在 Xcode 5.0.1 中有一个针对 iOS7 的项目。我正在使用 Storyboard 设计应用程序,并且正在使用 Autolayout。

当我构建和运行应用程序时,我正在使用 iOS 模拟器对其进行测试。我在 3.5" 和 4" 视网膜方案之间切换以在不同的屏幕尺寸上查看应用程序。

在大多数情况下,一切正常,自动布局似乎工作得很好。但是,在一个屏幕上,布局有问题,但仅限于以下情况:

  • 我在 iOS Simulator 下将 scheme 设置为“iPhone Retina (4-inch)”
  • 在 Storyboard 上,外形尺寸设置为“Retina 3.5 英寸”

在这种情况下,自动布局似乎可以在任何地方工作,除了我使用更复杂的视图结构的地方:

但是,如果我只是将 Storyboard 上的外形尺寸更改为“Retina 4 英寸”,那么 Storyboard 上的一切看起来都很好,而且当它运行时,它看起来也很好。如果我将外形尺寸保留为“Retina 3.5 英寸”并将 iOS 模拟器更改为“iPhone Retina(3.5 英寸)”,也是如此:

所以,我的问题是:这是正确的行为吗? Storyboard 外形尺寸是否必须与您正在测试的设备相匹配?我想知道,因为这是 Storyboard 中唯一导致问题的视图,但是,切换外形尺寸会使一切正常,因此 Autolayout 似乎工作正常。

【问题讨论】:

    标签: ios xcode xcode5 uistoryboard


    【解决方案1】:

    不,Storyboard 外形是为了向您展示它在不同屏幕尺寸下的外观。它不规定运行时视图的大小。

    我的猜测是,您的视图中一定存在一些未正确设置的约束,无法在该屏幕中使用 4" 屏幕。

    【讨论】:

    • 如果外形尺寸不代表视图的大小,为什么改变外形尺寸会影响最终构建?
    • 您也会在我的问题中注意到,如果我将 Storyboard 中的外形尺寸更改为 4" 屏幕,然后在 4" iPhone 模拟器上运行它,它可以正常工作。如果外形尺寸为 3.5" 并且我在 3.5" iPhone 模拟器上运行它,则相同。只有当外形尺寸和模拟器与屏幕尺寸不匹配时,我才会遇到这个问题。很明显,外形因素正在影响某些东西?
    • 这很好奇,但我仍然相信改变外形不会影响它。您是否可以在示例项目中复制它并在此处发布项目?
    • 我认为您一定是对的,因为当我使用“添加缺少的约束”选项并稍微调整这些选项时,无论是否有外形尺寸,我都能正确显示视图/模拟器屏幕大小差异。仍然不确定为什么会发生这种情况。也许故事板中的自动布局预览不准确。
    • 这是一个疯狂的猜测:你在 Xcode 4 中制作了那个屏幕,而你在 Xcode 5 中制作了其他屏幕?这两个版本处理约束的方式略有不同。但我很高兴它现在成功了。
    【解决方案2】:

    我知道这个问题很老,但我刚刚经历并解决了同样的问题。

    我的情况是这样的:

    1) 我有一个 UITableView,受限于我的视图控制器框架的大小。 2) 在 vi​​ewDidLoad 方法中,我添加了一个表头视图,使用我的表视图的框架作为表头的框架。

    UIView *headerView = [UIView alloc]initWithFrame:self.tableView.frame];    
    self.tableView.tableHeaderView = headerView;
    

    这给了我一个隐藏表格视图内容的标题,直到标题被向上滑动(类似于雅虎天气)。

    3) 在标题的底部,我有几个标签显示向上滑动之前可见的信息。

    问题:

    如果我在 3.5" 模拟器上启动我的应用程序,但将情节提要设置为 4" 手机,我的标题视图底部的标签将呈现在屏幕底部下方,将它们切断。

    如果我在 4" 模拟器上启动我的应用程序,但故事板设置为 3.5",则标签在表格的标题视图中显得太高。

    如果我在与故事板设置相同大小的模拟器上启动应用程序,一切都会完美运行。

    在头撞了几个小时后,我意识到我的表格视图的框架在调用 viewDidLoad 时没有使用自动布局约束设置。那时它是从我的故事板中推断出大小,然后根据约束进行调整。结果,我的表​​格视图标题与预期的表格视图大小不同。

    根据表格视图的大小移动添加表格视图标题的代码

    viewDidLayoutSubviews 
    

    方法,当应用了自动布局约束时解决了问题。

    【讨论】:

    • 太棒了!我认为这是最合理的解释
    【解决方案3】:

    我在 UIScrollView 上遇到了同样的问题。上面来自 user3847320 的答案可能是正确的。但就我而言,我在 viewDidLayoutSubviews 中进行布局时发生了崩溃。

    为了快速避免这种情况,只需在 viewDidLoad 中添加以下内容:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        self.scrollView.frame = self.view.frame;
    }
    

    【讨论】:

      猜你喜欢
      • 2014-06-05
      • 2012-12-26
      • 2018-01-15
      • 2011-06-05
      • 2020-09-11
      • 1970-01-01
      • 2012-09-17
      • 2017-05-09
      • 2013-09-22
      相关资源
      最近更新 更多