iOS 10下的自动调整大小功能无法正常工作

4

我有一个应用程序,它在没有AutoLayout和约束的情况下工作。我只在大小检查器中设置了自动调整大小。在iOS 9及更早版本下都可以正常工作。在iOS 10下,自动调整大小不起作用,并且将大小设置超出屏幕。请看下面的图片: 在模拟器中的iOS 10

![1]

同样的问题发生在iPhone 5和iPhone 6 Plus上。我该怎么办,才能让自动调整大小正常工作。
编辑1: 另一个解决方法是将storyboard设置为Xcode 7.x版本,在文件检查器下的Interface Builder文档中可以进行此操作。将选项打开设置为值Xcode 7.x。回答以下问题并保存关闭。如果您现在在iPad或iPhone上运行项目,则所有带有UIScrollView的视图控制器都可以通过自动调整大小正常工作。
重要提示: 此解决方法需要在对storyboard进行每次更改后执行。
编辑2: 我在苹果开发者论坛上发布了一个跨帖子,请看这里: https://forums.developer.apple.com/message/182716#182716

你能发布一个带有文本框的Storyboard或XIB文件图像,并打开尺寸检查器吗? - JingJingTao
这是视图控制器中带有大小检查器的图像。只有当宽度和/或高度的自动调整箭头被激活时,才会出现这些组件。 - Rolf Warnecke
那个天蓝色的背景是什么?那是另一个视图吗? - TheTiger
所有的UITextFields和UILabels都在一个UIScrollView上,并且它们的背景颜色是天蓝色。 - Rolf Warnecke
请显示scrollView自适应图片。 - TheTiger
请查看我的回答 https://dev59.com/qVkS5IYBdhLWcg3wu4rL#39594475 - Hassy
5个回答

4

这是Xcode 8的一个bug,只需使用7.x版本来构建您的应用程序,然后它将正常显示。


很遗憾,macOS Sierra不支持Xcode 7.x。 - Michael Long
@MichaelLong 你是在说Xcode的版本在Sierra上不可用,还是XIB中的7.x选项不可用? - SolidSnake4444
@SolidSnake4444 Xcode 7.x在Sierra下不稳定,容易崩溃。苹果公司已经表明Xcode 7.x在Sierra下不受支持。 - Michael Long

4
首先,进入有问题的故事板并找到相关的滚动视图,在属性中取消勾选“自动调整子视图”。这将防止Xcode自动撤销我们即将要做的一切。
其次,这是痛苦的部分,您需要修复滚动视图中视图的宽度并将其返回到正确的设置。只需单击视图,找到右侧控制旋钮,并将其拖回滚动视图内。
为了使下一步更容易,所有子视图都应该在一个单独的内容视图中嵌套在滚动视图中。(嵌套的内容视图也是在滚动视图中使用自动大小自动布局的“最佳实践”,所以请习惯它。)
请注意,如果您不先取消勾选“自动调整子视图”,那么每次重新打开故事板时,Xcode都会很友好地重新排列所有内容。
第三,您需要在代码中为滚动视图和内容视图添加IBOutlets。
最后,在您的ViewController中添加以下内容...
- (void)viewDidLayoutSubviews
{
    [self.scrollView setAutoresizesSubviews:YES];

    CGRect frame = self.contentView.frame;
    frame.size.width = self.view.frame.size.width - 20;
    self.contentView.frame = frame;

    [super viewDidLayoutSubviews];
}

基本上,我们正在重新启用自动调整大小,然后将内容视图的宽度设置为正确的宽度。 在这里,我希望我的内容视图嵌套在滚动视图中,并带有10像素的边距(因此是-20)。
对于故障滚动视图,需要针对每个进行上述操作。
这有点复杂,只是一个权宜之计,但比使用autolayout建立全新布局要快。 我能够在大约15分钟内修补带有大约十个场景和VC的storyboard。 如果使用自动布局重建所有内容,那将需要更长的时间。
请注意,这在最新的Xcode 8.1 beta版本中也没有解决。 我相信他们知道这个bug,但我也相信这是苹果公司“鼓励”开发人员开始使用自动布局的方式。

只需在滚动视图上取消选中“自动调整子视图大小”即可解决我的问题。谢谢! - irmakoz

2

有两种可能的解决方案:

  1. 修改自动调整大小掩码,像图片中显示的那样,这并不是100%理想的,因为没有正确的填充,但它可以工作。

enter image description here

  1. 设置文本字段的框架,即 CGRectMake(padding, y, self.view.frame.size.width-padding*2, height),这不是很好,因为你需要为每个文本字段都这样做,但是它也可以工作 :p。

不幸的是,我不确定为什么在iOS 10中,当你像你所做的那样设置textfield时,宽度会变成1000+,这可能与scrollview有关,如果没有scrollview进行测试,则会按预期工作。


谢谢你的回答。这确实是UIScrollView的问题。如果UITextField在滚动视图中,自动调整大小就无法正常工作。如果UITextField直接放在UIViewController上,自动调整大小就可以正常工作。第二步也可以使用UIScrollView中的UITextField正常工作。iOS 10中是否有UIScrollView方面的更改? - Rolf Warnecke
没问题,我认为UIScrollView没有改变,但我还没有查看过更改。 - JingJingTao
那是UIScrollView自动调整大小的一个错误。如果我打开一个旧项目并进入Storyboard,然后编译并启动应用程序,问题就会出现,UIScrollView中的所有组件都太大了。今天我向苹果提交了一个错误报告,希望能得到反馈。 - Rolf Warnecke

0

根据我的测试和这个线程,在Xcode 8.1 Beta 2中已经修复了该问题。


0

您可以从大小检查器中更改视图控制器的模拟大小。转到大小检查器并将模拟大小更改为自由形式。您可以根据需要设置视图的宽度和高度。要将屏幕查看为iOS 9中的样式,请将宽度和高度更改为600。

enter image description here


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