升级到Xcode 8后的布局问题

102

以下是我在升级至Xcode 8后屏幕的变化前后对比。
我所做的只是打开我的main.storyboard,然后在手机上构建和运行我的应用程序。
在我的版本控制中,我可以看到Xcode正在对我的main.storyboard进行许多更改,仅仅是我打开它而已。
每当我删除那些更改时,我就会看到我在Xcode 7.3.1中看到的内容。但是,只要我重新打开我的storyboard并进入界面构建器,我就会看到那些更改又回来了。

这里有什么我能做的吗?

Xcode 8之前

输入图像描述

升级至Xcode 8后

输入图像描述


尝试使用新的源代码(将之前所做的任何更改存储)重新打开XCode 8。现在,当您打开Storyboard时,请突出显示所有UI项目并单击“更新框架”。这可能会解决您的问题。 - d1str0
6
您能在bugreport.apple.com上提交一个错误报告并附上出现问题的故事板吗?我们希望进一步分析此问题。 - Quinn Taylor
1
我有完全相同的问题。在Xcode8中打开我的故事板并接受“选择初始设备视图”对话框后,一切都变得奇怪。当我更新所有帧时,IB看起来很好,但是构建后,应用程序完全崩溃。已使用4个应用程序进行测试。 - Cherrypig
@QuinnTaylor,我们的应用程序拥有庞大的用户群,在昨天发布的新版本中出现了这个问题。由于某种原因,这个问题只存在于我的环境中,但是我的同事们在他们的xcode8.0版本中没有这个问题。我们重新提交并加快修复请求。这给我们的用户带来了重大问题-他们无法查看他们的安全摄像头!是否有一个可以用于部署到应用商店的xcode版本的解决方案?(beta版本不能用于部署)如果没有,我将无法从我的计算机推送更新到应用商店! - jungledev
我有备份,所以我只需在Xcode 7.3中打开我的备份,将Storyboard作为源代码复制并粘贴到我的最新代码中。就这样。对我很有效。 - Mihir Oza
显示剩余4条评论
16个回答

111

当我将故事板文件转换成Xcode8兼容格式后,TableView中的图片也无法显示,我遇到了类似的问题。这看起来像是Xcode8的一个bug,因此在修复该bug之前,我们可以采用以下方法:

  1. 在Xcode8中打开你的故事板,并选择初始设备视图。进行正常修改。
  2. 完成修改后,在故事板文件中选中 -> 文件检查器 -> 打开方式 -> 选择“Xcode 7.x”。

这里输入图片描述

  1. 提示时选择“保存并关闭”
  2. 你的故事板更改将被保存,你的故事板将与Xcode8之前的版本一样工作。

需要对故事板文件进行其他更改时,再次按照上述步骤执行。


@DavidTruong 这是一个XIB文件而不是故事板,但我无法对初始文件进行更改,因为所有布局都已损坏,“更新框架”被禁用。我需要像在Xcode 7中一样处理该文件,但它不允许我这样做。 - jowie
真是不可思议,为什么XCode 8要这样做?? 升级到XCode 8后,只需查看我的XIBs的初始视图,几乎所有的视图都被搞砸了。这是适合我的解决方案,需要使用“在XCode 7中打开”保存它们。 - Wonton
对我有用。谢谢。 - mwaqas01
每当我尝试切换到Xcode 7布局时,我会保存并关闭,但是当我再次打开我的storyboard时,它会显示“选择一个初始查看视图”,并在选择视图后自动切换回Xcode 8选项.. 我该如何解决这个问题? - vbuzze
最新的Xcode更改为7.x,然后选择选择初始设备视图,然后Xcode会自动将最新的Xcode再次切换到8.0。如果有人遇到同样的问题,请帮帮我。 - lee
显示剩余14条评论

14

将XIB或Storyboard默认设置为较旧版本7.x并保存关闭。这是一个临时解决方案,但有效。在保存并关闭后,请勿再次打开。否则,需要重新从开始执行相同的步骤。输入图像描述


6
这不起到帮助作用,因为我需要在文件上进行编辑。所有这样做的只是为了向后兼容而保存文件。它并不能让xib在Xcode 8中被编辑。 - jowie
我正在做这件事,但是当我在下拉菜单中选择xib文件时,它仍然只显示Xcode 8.0... - jayant rawat

8

嗯,同样的问题。我在以下方式中部分地解决了它(适用于Xcode版本8.1 (8B62)

在Storyboard的文档大纲中,我点击了每个带有黄色箭头表示某些布局问题的场景(屏幕截图上的编号1)

之后,对于每个有问题的场景,我需要点击“更新框架”小图标(屏幕截图上的编号2),它会修复每个场景的所有布局问题。

enter image description here

然而,在我转换从Xcode7到Xcode8后,我的某个场景仍处于哭泣状态。我不得不通过调整约束或添加缺失的约束来手动修复它。
呼,XCode8和Storyboards带来了不好的惊喜。如果你使用AppCode编辑器,你就不会有这样的问题,因为它不支持Storyboards ;P
祝你好运!

7

4
我不这么认为... :( - Vaibhav Saran
Xcode 8.3.2 遇到了同样的问题。该死的 Xcode 和苹果 :( - lee

6
请关注以下链接,寻找可能的解决方案:(我相信许多开发人员都会遇到这个问题)。 Xcode 8 GM种Storyboard的问题 Xcode 8 - 先前的故事板被扭曲 (我使用了任意高度和宽度为600) 当Xcode升级到Xcode 8时,所有我的ViewControllers的大小都被更改。结果,所有布局都变形了。
目前,我认为此问题有三种解决方案(我不会相信很快就会有修复)。

1.对于每个ViewController进行修复:Update Frames.

2.进入主要的ViewController,设置Size Inspector -> Freeform -> 600,因为大多数控制器都是推断的,所以它将更改所有控制器的大小。(谨慎考虑苹果可能想引入的新功能的影响)。

3.放弃storyboard中的更改(我不建议这样做,因为苹果还插入了一些可能对Xcode很重要的更新)。
Xcode 8中新的AutoLayout功能附加链接(WWDC16): 制作自适应应用程序,第1部分

1
选项1是最明智的选择,而且对我很有效。正如Mike.R所指出的那样,要小心尝试“欺骗”XCode来修复问题,因为未来可能会带来更多麻烦。 - arcady bob
我也使用了选项1(我认为更安全)。但是这需要花费时间。 - Mike.R

5
在我的情况下,Akhil Kateja建议的解决方案可行。我还需要重置主视图的宽度和高度:

1) 将视图大小设置为自由格式

输入图片说明

2) 重置视图的宽度和高度为原始尺寸:

输入图片说明

最后保存即可完成。


4
对我来说,解决方案就是点击出问题的UIViewController,然后选择Editor > Resolve Auto Layout Issues > All Views In ... > Updates Frames。这将根据新选择的默认视图(在我的情况下为iPhone 7)重新排列视图以适应现有约束。
另外请注意:如果您像我一样遇到了导航栏错位视图警告,请简单地选择UINavigationController / UIViewController,然后选择Attributes Inspector > Bar Visibility > Shows Navigation Bar - 关闭再打开即可。

3
将视图大小从“Inferred”更改为“Freeform”对我很有帮助。它可以在“属性检查器”中的“模拟指标”标题下找到。

3

@david-truong的答案(https://dev59.com/FFkS5IYBdhLWcg3wvI60#39589860)在我的情况下并不适用,所以如果你和我有相同的情况,请尝试以下操作:

如果你的设备都已更新到iOS 10+,这个版本的Xcode将无法识别这些设备作为兼容设备。所以,请尝试这个技巧:

  • 前往: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport
  • 将与iOS 10或10.1相关的文件夹复制到: /Applications/Xcode 7.3.1.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport
  • 使用Xcode 7.3.1打开项目(如果已经打开,请重新启动Xcode)
  • 选择您连接的iOS 10+设备
  • 点击运行

注意: 使用这个技巧将无法使用Swift等新功能,但您应该能够加载和构建项目。


3
希望这能帮到你。
当我将Xcode从7.3更新到Xcode 8并运行应用程序时,有些视图显示得很完美,但有些却失真了。然后,我检查了nib文件,它提示我选择特定的设备大小,然后根据该设备大小显示nib,这当然不是Any-Any(Xcode 7.3)。因此,所有的nib文件都没有以正确的方式显示。
解决方案对我有效:按下下面图片中显示的黄色箭头。

enter image description here

它会提示一个弹出窗口,显示选项,例如:

enter image description here

选择 更新框架 并勾选 应用于容器中的所有视图,这将解决大约90%的UI失真问题,其余的自动布局约束问题可以手动解决。

这可能会破坏布局。在我看来,这必须非常小心地进行,一次只处理一个视图,并在继续之前检查是否成功。 - brainray
是的,当然需要花费一些时间,但这个解决方案可能会在更长的时间内帮助您,因为当您想要更新一些用户界面时。 - Anurag Bhakuni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接