Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.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 使用autolayout将视图浮动到第二行_Ios_Autolayout_Uicollectionview_Uistackview - Fatal编程技术网

Ios 使用autolayout将视图浮动到第二行

Ios 使用autolayout将视图浮动到第二行,ios,autolayout,uicollectionview,uistackview,Ios,Autolayout,Uicollectionview,Uistackview,我可以在情节提要视图控制器视图上设置约束,以便在有足够的水平空间时,有三个视图彼此相邻。在其他情况下,它将“浮动”一个视图到下一行 就像这个例子: 足够的空间 导致第三视图“浮动”的文本 可能堆栈视图在这里会有所帮助?否。如果视图和约束不适合同一行,则无法在情节提要中设置自动浮动到新行的视图和约束 (在我看来,这是自动布局系统的一大弱点。) 其原因在于约束的概念:从数学上讲,它们表示通常独立于x和y维度的线性方程组。唯一的例外是纵横比约束,它将视图的宽度与该(或另一)视图的高度连接起来。但我

我可以在情节提要视图控制器视图上设置约束,以便在有足够的水平空间时,有三个视图彼此相邻。在其他情况下,它将“浮动”一个视图到下一行

就像这个例子:

  • 足够的空间

  • 导致第三视图“浮动”的文本


  • 可能堆栈视图在这里会有所帮助?

    否。如果视图和约束不适合同一行,则无法在情节提要中设置自动浮动到新行的视图和约束

    (在我看来,这是自动布局系统的一大弱点。)

    其原因在于约束的概念:从数学上讲,它们表示通常独立于x和y维度的线性方程组。唯一的例外是纵横比约束,它将视图的宽度与该(或另一)视图的高度连接起来。但我想不出一种方法,如果需要的话,如何使用纵横比约束将视图分割成新行

    当系统在运行时解析您的约束并计算视图的实际帧时,它只会为每个维度(或者如果存在纵横比约束,则为两个维度)求解线性方程组。将浮动视图选项添加到Autolayout系统会使整个布局过程更加复杂,因为您无法将该行为描述为简单的线性方程

    (堆栈视图没有帮助,因为它们也只适用于一维:x或y。)

    最近,我需要与您描述的相同的浮动行为,并创建了
    UIView
    FloatingContainerView
    子类。我对它进行了概括,以便您可以将其用于任何类型的视图,并将其转换为Swift

    您现在可以在GitHub上找到它:

    没有理由期望自动布局系统能够实现这一点,它也不能

    这里要使用的是(
    UICollectionView
    )并使每个视图都成为集合视图中的一个单元格。事实上,如果您查看视图,它们看起来非常可重用,每个视图都有图标、标题和详细文本。可以设置集合视图,将单元格一个接一个地放置,直到没有更多的空间为止,然后在下面添加单元格,依此类推

    然后,可以使用“自动布局”将场景设置为围绕集合视图进行布局,当集合视图高度增加时,其他视图将在集合视图内容下方正确重新定位


    请将布局作为您需要的示例。

    似乎是合理的。我很想看看你到目前为止都做了些什么。只是为了强调。。。你是如何看待你的观点的“浮动”方面的?既然你已经有了一个明确的(和许多其他)通用观点,为什么还要重新发明轮子呢-
    UICollectionView
    ?其思想是创建一个容器视图,在其中放置所有应浮动的视图,并为其提供一个自定义类
    FloatingContainerView
    。设置其
    translatesAutoResizengMaskintoConstraint=NO
    ,以便可以使用Autolayout并将其与故事板中的约束连接起来。在自定义类中,保留对数组中所有浮动视图的引用。在迭代所有这些视图的
    layoutSubviews
    方法中,为每个视图设置
    translatesAutoresizingMaskIntoConstraint=YES
    ,并手动定位它们。您还需要覆盖
    intrinsicContentSize
    。是的,但需要更长的时间来实现替代方案。您可以做的是一些自定义视图,其中包含一个集合视图作为子视图,并实现所需的所有功能。然后对外部世界来说,它会像正常视图一样工作。这将是两个世界中最好的,事实上,实现了多少系统视图。(日期选择器、警报控制器等)@Fishman:我按照承诺将我的
    FloatingContainerView
    类放在GitHub上了:请参阅上面的链接。以防集合视图不适合你。(然而,正如我在上面的评论中所说,我强烈建议在您的案例中使用集合视图。Leo是对的。)好的。我就是这样做的。对可重用单元使用内容拥抱/压缩约束的组合。然而,它并不总是像我希望的那样。当只有一个单元格位于行中时,集合视图将单元格居中。集合视图非常健壮。很可能您没有正确实现布局。我已经用一个示例布局更新了我的答案,该布局应该实现您所需要的。我知道如何实现它。但是,我可以仅对约束执行相同的操作吗?没有手动计算布局属性?这是可能的。自iOS 8以来,当使用自动布局定义单元格时,集合视图单元格可以计算自己的属性。因此,设置单元格,然后让系统计算属性。请看这里:我得到的解决方案和你们链接的博客中描述的几乎相同。一切都很好。但是,如果只有单个单元格的空间,我希望避免居中。就像shinobi博客示例中的“点击和迫击炮”一样。重写此方法systemLayoutSizeFittingSize并遵循以下操作:-