有约束的Xcode 8 UIButton不显示

一切工作很好,直到昨天我更新Xcode到版本8。

如果我不使用任何约束,我可以看到button,但是当我将约束应用于button时,它们会消失,不pipe我应用什么或者有多less约束(高度,垂直间距,尾随等等)。

当我点击button,他们的行为正常(事件总是发送,所以我假设他们实际上在那里(?))。 我试图改变文字的颜色,背景颜色,(甚至添加一个新的UIButton),但没有运气结束。 我看不到button。 当我更改Centered View的背景颜色时,我可以在应用程序中看到此更改。 最奇怪的部分是当我点击Xcode上的Debug View Hierarchy来查看正在发生的事情时, 我可以看到所有button位于我所期望的。

约束 设计

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

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

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

更新:

我只是意识到在UILabel和UIImageView上也会出现同样的约束问题。 他们看起来很好没有约束,但是当我添加任何约束他们消失。

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

在我的情况下,我有一个水平,顶部和高度的UIButton约束。 显然在Xcode 8上,我的button的标题突然失踪。 然后奇怪的标题出现后,我删除了高度限制。 此行为可能在视图的布局周期内指示了一个问题。 我需要有高度限制,所以删除它并不是真正的解决scheme。 所以我试图在设置约束之前调用layoutIfNeeded ,但是没有效果。

我通过处理它的NSObject类在控制器上的viewDidLoad上生成这个button。 对我来说,解决scheme是在调用setUpsbutton的方法之前强制layoutIfNeeded

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

相关问题: clipsToBounds导致UIImage无法在iOS10和XCode 8中显示

编辑:

“我认为(0,0,1000,1000)绑定的初始化是Xcode从IB实例化视图的新方式,在Xcode8之前,视图是在xib中创build的,它们的大小是根据屏幕大小而定的,但是现在, IB文档中没有configuration大小,因为大小取决于您的设备select(在屏幕的底部)。

参考: 由于Xcode 8和iOS10,视图在viewDidLayoutSubviews上的大小不正确

从苹果发行说明:

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

一些现有的代码可能依赖于现在已经纠正的这种不正确的行为。 对于在iOS 10之前链接的二进制文件没有任何行为改变,但是在iOS 10上构build时,可能需要通过将-layoutIfNeeded发送到作为前一个接收者的translatesAutoresizingMaskIntoConstraints视图的超级视图来纠正一些情况,或者在之前进行定位和resize或之后,取决于你想要的行为)layoutIfNeeded。

参考: iOS10发行说明

我刚刚find解决scheme。 很可能这是一个Xcode 8的错误。 我也面临这个问题。

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

脚步,

  1. select你的.xib文件。

  2. 打开实用程序部分。

  3. select“文件检查器”

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

我想,这会帮助你。

我错过了将UIButton类设置为我的自定义类的要点。 我检查了我的自定义类,并看到我在awakeFromNib()方法上设置了angular半径。 在我设置圆angular半径之前,我调用了layoutIfNeeded() ,这是我的例子。

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

但是,如果你不这样做,你不能解决添加该行代码的同样的问题(至less,你不能在这个Xcode版本)。 使用viewDidLayoutSubviews()不工作太…

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

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

scrollview的约束应该是: top,bottom,leading,trailing

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

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