【问题标题】:Xcode 8 UIButtons with constraints not showing upXcode 8 UIButtons 约束未显示
【发布时间】:2017-01-23 00:50:25
【问题描述】:

过去一切都很好,直到昨天我将 Xcode 更新到版本 8。

如果我不使用任何约束,我可以看到按钮,但是当我对按钮应用约束时,无论有什么或有多少约束(高度、垂直间距、尾随等),它们都会消失我申请了。

当我点击按钮时,它们表现正常(事件总是被发送,所以我假设它们实际上位于那里(?))。我尝试更改文本颜色、背景颜色(甚至添加新的 UIButton),但没有成功。我看不到按钮。当我更改Centered View 的背景颜色时,我可以在应用程序上看到此更改。最奇怪的部分是当我在 Xcode 上单击 Debug View Hierarchy 以查看发生了什么时,那里的一切看起来都很好;我可以看到所有按钮都按预期定位。

在 iPhone 5 (iOS 9.3.5) 和 iPhone 6 (iOS 10) 上测试应用程序。

我正在使用 Swift 2.3、iOS 10 和 Xcode 8。

这是 Xcode 8 上的错误吗?如何解决这个问题?

更新:

我刚刚意识到 UILabel 和 UIImageView 也会出现同样的约束问题。它们在没有约束的情况下看起来很好,但是当我添加任何约束时它们就会消失。

【问题讨论】:

  • 我遇到了同样的问题,在我的情况下,是“layer.CornerRadius”造成了问题。(在知道帧大小之前,我根据 Button 帧设置了它们。)在 Xcode 7 中没问题。

标签: ios uibutton storyboard constraints


【解决方案1】:

通过在设置任何与布局相关的属性(如 clipToBounds 等)之前强制布局来解决此问题...棘手的部分是何时何地调用 layoutIfNeeded。

就我而言,我有一个带有水平、顶部和高度约束的 UIButton。显然在 Xcode 8 上,我的按钮标题突然不见了。然后在我删除高度限制后出现了足够奇怪的标题。此行为表明视图的布局周期中可能存在问题。我需要有高度限制,所以删除它并不是真正的解决方案。所以我尝试在设置约束之前调用layoutIfNeeded,但没有效果。

我通过处理它的 NSObject 类在控制器上的 viewDidLoad 上生成这个按钮。我的解决方案是在调用设置按钮的方法之前强制layoutIfNeeded。

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view layoutIfNeeded];
    //editBooking - NSObject class where the button gets configured.
    [_editBooking setUpViews];
}

相关问题:clipsToBounds causes UIImage to not display in iOS10 & XCode 8

编辑:

“我认为 (0, 0, 1000, 1000) 绑定初始化是新的方式 Xcode 实例化来自 IB 的视图。在 Xcode8 之前,视图是创建的 在 xib 中配置大小,然后根据 屏幕之后。但是现在,IB文档中没有配置大小 因为大小取决于您的设备选择(在底部 屏幕)。”

参考:Since Xcode 8 and iOS10, views are not sized properly on viewDidLayoutSubviews

来自 Apple 发行说明:

向视图发送 layoutIfNeeded 不会移动视图,但在早期版本中,如果视图已将 translatesAutoresizingMaskIntoConstraints 设置为 NO,并且如果它被约束定位,则 layoutIfNeeded 将移动视图以匹配之前的布局引擎将布局发送到子树。 这些更改纠正了这种行为,并且接收器的位置及其大小通常不会受到 layoutIfNeeded 的影响。

一些现有代码可能依赖于这种不正确的行为,现已更正。在 iOS 10 之前链接的二进制文件没有行为变化,但是在 iOS 10 上构建时,您可能需要通过将 -layoutIfNeeded 发送到作为前一个接收器的 translatesAutoresizingMaskIntoConstraints 视图的超级视图来纠正某些情况,或者之前对其进行定位和调整大小(或之后,取决于您想要的行为)layoutIfNeeded。

参考:iOS10 release notes

【讨论】:

  • 我是否也必须在-(void)awakeFromNib; 中为单元格执行此操作?编辑:我将[self.contentView layoutIfNeeded]; 添加到我受影响的一个tableViewCells 的方法中,它解决了这个问题。最好我将单元格子类化以防止这种情况再次发生;至少在 Apple 发布 XCode8 更新来解决这个问题之前。
  • @Jargen89 不确定这是 Xcode 的错误还是新规范 - 请参阅上面的编辑。可能我们会得到一个修复来降低更改的严重性,但我认为 Apple 现在正在通过这种方式强制使用自动布局。我不得不用约束替换大部分依赖帧大小的视图,这解决了大多数问题,而无需强制布局。
  • 这拯救了我的一天!谢谢! self.view.layoutIfNeeded() 迅速
  • 伟大的挽救了生命并节省了很多时间!自过去 7 天以来一直有麻烦 :(
【解决方案2】:

我刚刚找到了解决方案。这很可能是 Xcode 8 的错误。我也遇到过这个问题。

解决方法是在界面生成器中更改Xcode版本..

步骤,

  1. 选择您的 .xib 文件。

  2. 打开实用程序部分。

  3. 选择“文件检查器”

  4. 在“Interface Builder Documents”下,将“Opens in”的 Xcode 版本更改为“Xcode 7.x”

我想,这会对你有所帮助。

【讨论】:

  • 在我尝试了一切都没有成功之后,所以我尝试将其更改为 Opens in XCode 7 .... 一个警告建议故事板将关闭然后重新打开.. 之后,我运行该应用程序再次出现,所有按钮都出现了......此外,情节提要仍然显示在 XCode 8 中打开......
  • 这是一个比接受的答案和投票最高的答案更好的解决方案,因为它将与 Xcode 8 的未来版本向前兼容,其中错误已修复,无需修改不必要的代码。
  • 我发现了另一种解决方法。在设置cornerRadius之前,将layoutIfNeeded()设置为视图。
  • @MacKa 感谢您的回答好友.. 我在这种愚蠢的 xcode 中浪费了一个小时。
【解决方案3】:

我错过了将 UIButton 类设置为我的自定义类的要点。我检查了我的自定义类,发现我在awakeFromNib() 方法上设置了圆角半径。在我设置圆角半径之前我打电话给layoutIfNeeded(),这是我的解决方案。

【讨论】:

    【解决方案4】:

    我不知道这是否是一个错误,但我在 awakeFromNib() 方法上添加了 self.layoutIfNeeded() 解决了它。以防万一,我正在继承UIButton...

    但是,如果您不这样做,则添加该行代码将无法解决相同的问题(至少,在此 Xcode 版本中您无法解决)。使用viewDidLayoutSubviews() 也不起作用...

    【讨论】:

    • 那也行不通。调用 layoutIfNeeded() 无效。
    【解决方案5】:

    确认这是当前(截至 10 月 19 日)通过 App Store 分发的 XCode 8 存在的问题。它不必要地从 Storyboard/xib 文件中删除了一些 <rect/> 元素。

    layoutIfNeeded 的解决方法都不适合我。我最终下载了修复此问题的 XCode 8 Beta 3。

    【讨论】:

      【解决方案6】:

      滚动视图的约束应该是:top,bottom,leading,trailing

      scrollview 中 contentview 的约束应该是:top,bottom,leading,trailing,fixed height and center x(horizontally in container)

      【讨论】:

      • 我认为你没有注意我的问题。无论我应用什么约束,按钮都会消失。即使我只应用“高度”约束,它们也会消失。
      • 如果你对 scrollview 应用约束会发生什么?它会消失吗?
      • 不,它没有。 “当我更改中心视图的背景颜色时,我可以在应用程序上看到这种变化。”在这个页面上,只有这些按钮看不见,其余的控件(UIScrollView、UIView)从未看不见。它们看起来和预期的一样。
      • 然后尝试设置我在回答中提到的约束。然后添加按钮,然后尝试为按钮设置约束!
      • 它不起作用,因为正如我所说,无论我应用什么约束以及应用多少约束,按钮都会消失。
      【解决方案7】:

      Xcode 8.1 Beta 2 (8T46g) 似乎修复了 1000x1000 内容大小问题(当然还有表格/集合视图单元格内的自动布局问题)。 所以,它在 Xcode 7.x 中的工作原理在 Xcode 8.1 Beta 2 中没有问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-02
        • 1970-01-01
        • 1970-01-01
        • 2017-03-04
        相关资源
        最近更新 更多