更新到Xcode 8后的布局问题


102

升级到Xcode 8之后,这是屏幕之一的前后。
我所做的只是打开main.storyboard,然后在其中构建并运行我的应用程序。
在我的版本控制中,我可以看到Xcode仅在打开它后对main.storyboard进行了很多更改。
每当我删除这些更改时,都可以在Xcode 7.3.1中看到使用的内容。
但是,当我使用情节提要重新打开界面生成器时,我看到这些更改又恢复了原样。

有什么我可以做的吗?

在Xcode 8之前

在此处输入图片说明

更新到Xcode 8之后

在此处输入图片说明


尝试再次使用新的源代码打开XCode 8(保存以前所做的所有更改)。现在,当您打开情节提要时,突出显示所有UI项目,然后单击“更新框架”。这可能会解决您的问题。
d1str0

6
您可以在bugreport.apple.com上提交错误,并附上正在发生的情节提要吗?我们想进一步分析。
奎因·泰勒

1
我有完全一样的问题。在Xcode8中打开我的故事板并接受“选择初始设备视图”对话框后,一切都变得很奇怪。当我更新所有框架时,IB看起来不错,但是构建之后,该应用程序完全坏了。使用4个应用程序对其进行了测试。
Cherrypig

@QuinnTaylor我遇到了类似的问题,在Xcode 8转换我的故事板之后,尽管UITableViews中的UIImageViews的轮廓在中可见,但UIImageViews中没有显示任何内容Debug View Hierarchy。UICollectionViews中相同类的其他对象不受影响。
曼努埃尔

XIB或情节提要设置默认为较早版本7.x,然后保存并关闭。临时解决方案,但可行。完成“保存并关闭”后,请勿再次打开。否则再次需要从头开始执行相同的步骤。
Bhavesh Kumbhani

Answers:


111

将故事板文件转换为与Xcode8兼容后,我也遇到了类似的问题,即无法显示表格视图图像。这看起来像是Xcode8的错误,因此在发布错误修复之前,这里的解决方法是:

  1. 在Xcode 8中打开情节提要,然后选择一个初始设备视图。像往常一样进行更改。
  2. 完成更改后,选择情节提要-> File Inspector-> Opens in->选择'Xcode 7.x'。

在此处输入图片说明

  1. 出现提示时选择“保存并关闭”
  2. 您的情节提要更改将被保存,并且情节提要将像Xcode8之前一样工作。

当您需要对情节提要文件进行其他更改时,请再次执行以下步骤。


确实为此+1。我在TodayExtension中的iOS 10中对此进行了挣扎。直到我缩小范围,分析git diffs,我才发现Xcode 8添加了可疑的Storyboard xml编辑。在为Xcode 7保存了Storyboard文档(进行编辑后)之后,我现在可以使用适用于iOS 10的Xcode8。谢谢。
John Erck

它肯定看起来是一个错误。在Xcode 7.x中另存为Opens对我来说是一个临时解决方法。
史蒂夫(Steve)

我花了3天的时间在Xcode8中修复所有损坏的布局,直到找到这篇文章为止。我可能应该比苹果更信任像你们这样的人。不敢相信这会浪费我太多时间。David非常感谢您!
徐茵

@XuYin我们应该为每个故事板执行此操作吗?我的意思是,如果我的项目中还有另一个故事板,该怎么办?那Xib文件呢?我也应该为那些人做吗?
亲爱的

@Honey我没有在情节提要中执行此操作,但是我在遇到问题的每个xib文件中都执行了此操作。但我认为,如果您看到奇怪的布局问题,也可以在情节提要上尝试一下。因为该修复仅需5秒钟。并且在重新构建应用程序之后,您应该能够很快看到修复程序。
徐茵

14

XIB或情节提要设置默认为较早版本7.x,然后保存并关闭。临时解决方案,但可行。完成“保存并关闭”后,请勿再次打开。否则,再次需要从头开始执行相同的步骤。在此处输入图片说明


6
这无济于事,因为我需要处理文件。这一切都是为了向后兼容而保存文件。不允许在Xcode 8中编辑
xib。– jowie

我正在执行此操作,但再次在下拉菜单中选择xib文件时,它仅显示xcode 8.0 ...
jayant rawat

8

嗯,同样的问题。我通过以下方式部分解决了该问题(针对Xcode版本8.1(8B62)

在情节提要的文档大纲中,我单击了每个带有黄色箭头的场景,这些箭头指示一些布局问题(屏幕截图中的数字1)

此后,对于每个有问题的场景,我必须单击“更新框架”小图标(屏幕截图上的数字2),该图标解决了每个场景的所有布局问题。

在此处输入图片说明

但是从我的情况来看,从Xcode7过渡到Xcode8后,一个场景仍然处于哭泣状态。我必须通过调整约束或添加缺少的约束来手动修复它。

哎呀,XCode8和Storyboards并不是一个惊喜。如果您使用AppCode编辑器,则不会出现此类问题,因为它不支持Storyboards; P

祝好运!



6

请遵循线程以获取任何可能的解决方案:(我相信许多开发人员都会遇到这种情况)。
Xcode 8 GM种子情节提要
Xcode 8-以前的情节提要变得失真

(我使用anyH anyW width 600)当Xcode更新为Xcode 8时,它更改了我所有的ViewControllers大小。结果,所有布局都失真了。
目前,我仅看到3种解决方案(我不信任很快就会解决问题)。

1.转到每个Viewcontroller并通过进行修复Update Frames

2.转到主ViewController,Size Inspector -> Freeform -> 600因为推断大多数控制器都会改变它们的大小。(请注意我要介绍的Apple新功能的影响)。

3.丢弃情节提要中git的更改(我不建议这样做,因为Apple还插入了一些可能对Xcode重要的更新)。

Xcode 8(WWDC16)中新的自动布局功能的附加链接: 使应用程序具有自适应性,第1部分


1
选项1是最明智的选择,对我有用。正如Mike.R所指出的那样,请谨慎尝试“欺骗” XCode来修复问题,因为不可避免地会带来更多麻烦。
arcady bob

我也使用了选项1(我认为它更安全)。但是很费时间。
Mike.R 16/09/27

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-将其切换为OFF,然后再次为ON。



3

我有同样的问题,我通过强制更新控制器的视图约束来解决。将以下代码放入您的viewDidLoad()函数中

self.view.layoutIfNeeded()

1
干杯比尔!那个“ layoutIfNeeded”对我有用!(在尝试了所有其他方法几个小时之后。)
Ethan Halprin

3

我选择了每个控制器,然后单击“更新框架”,它固定了布局。


3

@ david-truong(https://stackoverflow.com/a/39589860/1407528)的答案在我的情况下不起作用,因此如果您处于我的相同情况,请尝试以下操作:

如果您已将所有设备更新到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)。因此,所有笔尖文件均未正确显示。

我的解决方案是:-按下黄色箭头,如下图所示

在此处输入图片说明

它会提示一个弹出窗口,显示诸如

在此处输入图片说明

选择Update FramesApply to all views in containerchecked.it将围绕扭曲UI的90%,解决和休息的自动布局约束问题可以手动解决。


这也可能破坏布局。恕我直言,此操作必须格外小心,一次只能查看一次,并在继续之前检查是否已解决问题。
brainray

是的,当然,您需要花费一些时间,并且此解决方案可能会帮助您更长久地运行,就像您要更新一些用户界面时一样。
阿努拉格


1

为了解决类似的问题,我将xib配置为Freeform(未推断),并将xib文件保存为与Xcode 7.x兼容。就我而言,这两个步骤都是必需的。希望对您有所帮助!


1

我注意到Xcode 8.2中有一个新按钮(检查图像中的橙色圆圈)。它会给您一些帮助。

步骤:1.打开情节提要,然后选择所需的任何设备2.只需选择View Controller 3.单击提到的按钮(如图所示)4.它将更新该View Controller的框架,您可以继续进行操作

我没有找到比这更好的解决方案了。如果找到一个,请回复。

IB屏幕截图


没事
Muju'5

0

在viewdidload中更新约束和布局子视图可解决问题

- (void) viewDidLoad {
        [self.view updateConstraints];
        [self.view layoutSubviews];
        [super viewDidLoad];
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.