Xcode 8 UIButton,但没有出现约束

时间:2016-09-15 05:15:53

标签: ios uibutton storyboard constraints

直到昨天,我一直都很好地工作,我将Xcode更新为版本8.

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

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

Constraints Design

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

我使用的是Swift 2.3,iOS 10和Xcode 8。

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

更新

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

7 个答案:

答案 0 :(得分:20)

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

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

我在控制器上的viewDidLoad上通过处理它的NSObject类生成此按钮。对我来说,解决方案是在调用setUps按钮的方法之前强制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到视图不会移动视图,但在早期版本中,如果视图已将translateOutoresizingMaskIntoConstraints设置为NO,并且如果它是通过约束定位的,则layoutIfNeeded将移动视图以匹配布局引擎之前将布局发送到子树。   这些更改纠正了这种行为,接收者的位置及其大小通常不受layoutIfNeeded的影响。

     

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

参考:iOS10 release notes

答案 1 :(得分:4)

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

解决方案是在界面构建器中更改Xcode版本。

步骤,

  1. 选择.xib文件。

  2. 打开“工具”部分。

  3. 选择“文件检查器”

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

  5. 我想,这会对你有帮助。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

scrollview的约束应为:top,bottom,leading,trailing

在scrollview中对contentview的

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

答案 6 :(得分:0)

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