Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
试图理解iOS 8中的UIScrollView自动布局_Ios_Xcode_Swift_Autolayout - Fatal编程技术网

试图理解iOS 8中的UIScrollView自动布局

试图理解iOS 8中的UIScrollView自动布局,ios,xcode,swift,autolayout,Ios,Xcode,Swift,Autolayout,关于:自动布局和这个简单的示例,我遗漏了什么? 使用带有iOS单视图模板的xcode 6.2,我的故事板如下所示: 我有一个带有滚动视图的视图控制器,它会占用可用空间。scrollview上的interface builder没有设置任何约束,因此它应该将自动调整大小掩码转换为约束 当我在模拟器中运行它时,我得到以下输出。注意控制台中的测量输出。我在viewdilayoutsubview和viewdilearch中获得了这些测量值,它们在两种情况下都是相同的。此外,在本例中,我启用和禁用了Ad

关于:自动布局和这个简单的示例,我遗漏了什么?

使用带有iOS单视图模板的xcode 6.2,我的故事板如下所示:

我有一个带有滚动视图的视图控制器,它会占用可用空间。scrollview上的interface builder没有设置任何约束,因此它应该将自动调整大小掩码转换为约束

当我在模拟器中运行它时,我得到以下输出。注意控制台中的测量输出。我在
viewdilayoutsubview
viewdilearch
中获得了这些测量值,它们在两种情况下都是相同的。此外,在本例中,我启用和禁用了
Adjust Scroll View Insets
,结果相同:

渲染结果为:

请注意scrollview控制台中的边框和边框大小:600x600。此外,在视图底部有一个非常明显的白色间隙。这与情节提要布局不一致。它应该充满了视野。因此,我只能假设,在故事板中,大小类设置为600x600,自动布局约束将从中转换

公平地说,让我们关闭它们,在
viewDidLoad
中,我做了以下操作,假设如果我没有设置任何附加约束,结果帧将为0x0:

view.setTranslatesAutoresizingMaskIntoConstraints(false)    
scrollView.setTranslatesAutoresizingMaskIntoConstraints(false)
什么也没发生,视图呈现与上面相同,不是我假设的0x0维度,而是600x600维度。显然,我的假设是错误的。

接下来,我尝试自己添加约束:

view.setTranslatesAutoresizingMaskIntoConstraints(false)    
scrollView.setTranslatesAutoresizingMaskIntoConstraints(false)
仍然存在。下一次在模拟器中运行时,我得到了很多输出,告诉我存在冲突的约束。具体来说,有两个问题我没有设置:
NSIBPrototypingLayoutConstraint
,这让我觉得显然
setTranslatesAutoResistingGMaskintoConstraints
被忽略了

我发现这是对同一问题的提及:

好的,这里有一些约束,我将删除所有约束并尝试手动重新设置它们,我还将省略
settranslatesAutoResizezingmaskintoConstraints

// there should be no need to set the translates auto resizing mask
// to false, as I'm removing everything anyway.
view.removeConstraints(view.constraints())

var h1 = NSLayoutConstraint.constraintsWithVisualFormat("H:|[view]|",
    options: NSLayoutFormatOptions(0), metrics: nil, views: ["view": scrollView])

var v1 = NSLayoutConstraint.constraintsWithVisualFormat("V:|[view]|",
    options: NSLayoutFormatOptions(0), metrics: nil, views: ["view": scrollView])

view.addConstraints(h1 + v1)
这产生了预期的输出:

没有间隙,在底部,日志输出也是正确的

如果我在interface builder中设置约束,则可以收到相同的结果。我假设IB中的设置约束删除了
NSIBPrototypingLayoutConstraint
s

所以我真的不明白这里发生了什么。我的意思是,我想我明白为什么我的最后一个例子给了我我所期望的。我删除了所有的约束,并自己设置它们;这是有道理的。或者我使用Interface Builder执行与上面代码相同的操作

我显然不明白的是Interface Builder如何处理自动生成的约束类型
NSIBPrototypingLayoutConstraint
,以及为什么设置
SetTranslatesAutoResistingGMaskintoConstraints
似乎对它们毫无作用


这只是一个bug吗?

当您创建一个没有任何约束的视图时,Interface Builder会警告您:

选定的视图没有约束。在构建时,将为视图生成显式的左约束、顶约束、宽度约束和高度约束

出于您的目的,自动生成的左约束和上约束为零很好。但是,自动生成的宽度和高度约束(600)不适用。如果您希望它使用顶部/底部和前导/尾随约束,那么您应该自己添加它们

或者,如果选择“重置为建议的约束”,即使这些约束比在没有任何约束的情况下生成的600x600约束更好:

view.setTranslatesAutoresizingMaskIntoConstraints(false)    
scrollView.setTranslatesAutoresizingMaskIntoConstraints(false)

是的,但这仍然不能解释为什么会忽略
设置TranslatesAutoResizingMaskinToConstraints(false)
。我将接受你的回答,因为我得出的结论是,你应该始终设置约束条件,以免出现意外行为。因为它没有使用
translatesAutoResistingGMaskintoConstraints
。查看
translatesAutoResizengMaskintoConstraints
的值,它已经是
false
。它没有使用那个功能,而是使用它为您添加的约束。啊,这也有助于消除那些原型约束: