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
Swift 来自XIB的视图的自动布局约束_Swift_Xcode_Io_Autolayout_Interface Builder - Fatal编程技术网

Swift 来自XIB的视图的自动布局约束

Swift 来自XIB的视图的自动布局约束,swift,xcode,io,autolayout,interface-builder,Swift,Xcode,Io,Autolayout,Interface Builder,我正在从一个圆加载一个视图(形成一个圆)。我想确定的是,圆圈的大小可以适应不同的屏幕大小。到目前为止,我尝试将视图放置在另一个视图中,将边距固定到superview,然后将superview的纵横比设置为1:1。这给了我一个圆圈。然而,现在,我想改变它的大小。当前,superview的大小由其中的另一个子视图(标签)指定。根据标签的内容,superview的大小会发生变化(我已将标签的字体大小设置为自动收缩)。如果我尝试在边距约束中添加一个常量,它会起作用,但在不同的屏幕大小中看起来大小相同。此

我正在从一个圆加载一个视图(形成一个圆)。我想确定的是,圆圈的大小可以适应不同的屏幕大小。到目前为止,我尝试将视图放置在另一个视图中,将边距固定到superview,然后将superview的纵横比设置为1:1。这给了我一个圆圈。然而,现在,我想改变它的大小。当前,superview的大小由其中的另一个子视图(标签)指定。根据标签的内容,superview的大小会发生变化(我已将标签的字体大小设置为自动收缩)。如果我尝试在边距约束中添加一个常量,它会起作用,但在不同的屏幕大小中看起来大小相同。此外,我还尝试添加了一个乘数,虽然乘数适用于尾随页边距和底部页边距,但设置乘数不会影响顶部页边距和前导页边距。下面是IB的屏幕截图(今天的视图是问题中的形状)。

您有了一个良好的开端-以1:1的比例对齐X和Y中心。您只需添加两组具有不同优先级的上/下和前导/尾随约束。下面是一个示例,它与您拥有的三个约束相结合,将使视图在所有方向上居中,并沿较窄的轴设置10点边界:

优先级==750

  • Top=10分
  • 底部=10分
  • 领先=10分
  • 尾随==10分
优先级==1000

  • 顶部>=10分
  • 底部>=10点
  • 领先>=10分
  • 尾随>=10点
在执行此操作时,您可能会看到错误/警告,因为IB不知道如何渲染它,但一旦完成此操作,您将获得所需的内容

编辑:

从内存中,有点和像素。在可能的时候和地方,试着用点来思考。大概你唯一想从像素的角度来思考的是图像。(可能还有其他的图形测量方法,但同样,我是从内存中写的。)

点在设备尺寸上应该是一致的——因此,如果你在4英寸的iPhone屏幕上有一个100x100的正方形,那么它在12.9英寸的iPad Pro上的尺寸将是相同的

更重要的是,可以使用自动布局将边距设置为相同的边距。两个屏幕上的25点边距相同。因此,在我上面的示例中,您将获得几乎所有设备中可能的最大矩形,因为您设置的是边距,而不是视图大小

去年我深入研究了屏幕尺寸,以下是当前的屏幕尺寸:

//iPad Pro        1366x1024
//iPad            1024x768
//iPad Mini       1024x468
//iPhone 6 Plus   736x414
//iPhone 6        677x375
//iPhone 5        568x320
//iPhone 4        480x320
因此,基于此,上述限制将在iPhone4(也包括iPhoneSE)上产生一个300x300的正方形,因为最窄的轴将是320减去两个10点的边距。在12.9英寸的iPad Pro上,它将是一个1004x1004的正方形

在代码中创建约束时,还可以使用以下代码创建layoutMarginGuide:

    let margins = view.layoutMarginsGuide
这应该与在IB中选中“包含到页边距”复选框相同。本质上,这是每个设备的建议页边距大小。(我认为这还应该包括状态栏、选项卡和导航栏,甚至包括iPhone的“phone call top banner(sic)”。但我在这方面遇到了一些问题。)

编辑2:

综上所述,您通过“自动布局”定义的是一种非常流畅的方式,可以最大化正方形的大小(或者在您的例子中,将正方形变成圆形)。通过设置两组边距,一组等于但具有高优先级,您可以让auto layout知道它可能会打破这一限制。第二组值必须大于或等于


因此,在480x320设备中,无法满足的上/下边界约束(“等于”)可能会被打破,而在横向中,无法满足的前/后边界约束将被打破。请记住,您已经设置了中心X/Y,因此视图将居中,并且您设置了1:1的比例,使其成为正方形。(只要您没有触及优先级-默认设置是必需的。

您有一个良好的开端-将两个中心X和Y对齐,比例为1:1。您需要添加的是两组具有不同优先级的顶部/底部和前导/尾随约束。以下是一个示例,它与您拥有的三个约束结合在一起,将成为中心沿较窄轴具有10点边界的所有方向的视图:

优先级==750

  • Top=10分
  • 底部=10分
  • 领先=10分
  • 尾随==10分
优先级==1000

  • 顶部>=10分
  • 底部>=10点
  • 领先>=10分
  • 尾随>=10点
在执行此操作时,您可能会看到错误/警告,因为IB不知道如何渲染它,但一旦完成此操作,您将获得所需的内容

编辑:

从内存中,有点和像素。在可能的时候和地方,试着用点来思考。你可能希望用像素来思考的唯一时间是图像。(可能还有其他的图形度量,但我还是从内存中写的。)

点在设备尺寸上应该是一致的——因此,如果你在4英寸的iPhone屏幕上有一个100x100的正方形,那么它在12.9英寸的iPad Pro上的尺寸将是相同的

更重要的是,可以使用自动布局将边距设置为相同。两个屏幕上的25点边距都是相同的。因此,在我上面的示例中,您将获得几乎所有设备上可能的最大矩形,因为您设置的是边距,而不是视图大小

去年我深入研究了屏幕尺寸,以下是当前的屏幕尺寸:

//iPad Pro        1366x1024
//iPad            1024x768
//iPad Mini       1024x468
//iPhone 6 Plus   736x414
//iPhone 6        677x375
//iPhone 5        568x320
//iPhone 4        480x320
因此,基于上述限制,iPhone 4(也包括iPhone SE)上的面积将为300x300平方米,因为最窄的轴将为320平方米,减去两个10点的边距。而iPad Pro 12.9英寸上的面积将为1004x1004平方米