有约束的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版本。
脚步,
-
select你的.xib文件。
-
打开实用程序部分。
-
select“文件检查器”
-
在“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中没有问题。