能够将约束从一个视图复制到另一个视图吗?

36

假设我使用Interface Builder在Storyboard中使用自动布局创建用户界面。我可以将一些约束条件从一个视图复制或移动到另一个视图吗?


在运行时还是使用IB?什么样的约束条件?请详细说明,因为有太多问号无法帮助您。您的情况究竟是什么? - kedzia
我澄清了我的问题。 - kelin
那么...你试试怎么样? - LinusGeffarth
3个回答

20
如果您正在使用界面生成器,如果您使用cmd-c或编辑/复制,将会自动复制一些包括复制视图层次结构的约束条件。否则,不行。如果您想要保留约束条件,请复制整个视图。

1
这是一个不同的问题,请看我的答案:http://stackoverflow.com/a/28626319/1758701。 - Display Name
1
我通过编辑Storyboard的源代码来更改视图类型。 - kelin
1
好的,看起来这是正确的答案。 - kelin
1
我们能否通过编程将一个视图的约束复制到另一个视图中? - MANISH PATHAK
@iOSdev 我能否以编程方式复制约束并在视图控制器中设置?实际上,我正在通过生成一些文本框和标签来制作表单,并希望将其保存在视图控制器中作为表单。有什么想法如何实现这个? - Xcodian Solangi
显示剩余2条评论

18
这里有一个技巧可以复制所有的约束:我有一个小视图嵌套在主视图中,想要将其复制到另一个视图控制器中。为此,我将整个主视图复制到新的视图控制器的主视图中。然后,我将小视图(在侧边层次结构中)拖到新控制器的主视图中,最后只需删除不需要的旧主视图即可。这样,您可以保留小视图中项目的所有约束。
希望对您有所帮助 :)

我无法让它正常工作,不知道他们是否“修复”了这个问题。无论如何,期待SwiftUI的到来。 - C. Skjerdal

18
你可以通过了解和学习 .xib 文件的 XML 工作原理来实现。我习惯于使用它们,因此能够将带有约束条件的视图移动到另一个视图中。
我会尝试逐步解释:
  1. 为其创建输出口:myView
  2. 右键单击 .xib 文件 > Open As > Source Code 或在其他编辑器(如 Sublime Text)中打开它
  3. 搜索 myView,你会找到类似以下内容的代码:

    <outlet property="myView" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
    

    复制destination属性的值

  4. 搜索已复制的 id (i5M-Pr-FkT),其中一个结果将是一个view标签:

  5. <view contentMode="scaleToFill" id="i5M-Pr-FkT"> <!-- 1 -->
        ...
    </view>
    
    将整个 view 标签复制并粘贴到所需视图的 subviews 标签中:
    <view contentMode="scaleToFill" id="Ovp-8Y-qHZ"> <!-- 2 -->
        <subviews>
            <view contentMode="scaleToFill" id="i5M-Pr-FkT"> <!-- 1 -->
                ...
            </view>
        </subviews>
    </view>
    
    继续搜索复制的id,你会发现一些具有该id的限制条件,例如:
    <constraint firstItem="w7M-JQ-JWD" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="EwH-B1-XWY"/>
    
    你需要将此代码移动到两个父视图(旧的和新的)的最近公共祖先的 constraints 标签中:
    <view contentMode="scaleToFill" id="rK2-sE-P0d"> <!-- 3 -->
        <subviews>
            <view contentMode="scaleToFill" id="Ovp-8Y-qHZ"> <!-- 2 -->
                <subviews>
                    <view contentMode="scaleToFill" id="i5M-Pr-FkT"> <!-- 1 -->
                        ...
                    </view>
                </subviews>
            </view>
        </subviews>
        <constraints>
            <constraint firstItem="w7M-JQ-JWD" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="EwH-B1-XWY"/>
        </constraints>
    </view>
    

很棒的回答!我看到你正在通过id搜索视图,如果我想复制该视图,而不是剪切和粘贴,该怎么办?我想id应该是唯一的。它应该由某些特定规则生成,还是随机修改就足够了? - kelin
是的,每个.xib文件中的id应该是唯一的,因此即使对于viewconstraint也不能相同。虽然我无法保证,但从我所看到的来看,它是完全随机的,但为了安全起见,请将其保留在相同格式中:3 chars - 2 chars - 3 chars。您还可以添加一个新的view,通过将其定位在视图层次结构的顶部来更轻松地找到它,或者在添加之前分阶段文件,复制其id,删除该视图并使用该id来检测它。 - Iulian Onofrei
如果这个答案对你有帮助,请接受并采纳它,因为现在的答案并没有实现你的要求。 - Iulian Onofrei
当然,因为故事板也是XML,我认为它们包含多个xib结构。 - Iulian Onofrei
2
太好了,我成功复制了几个视图,请确保检查每个约束和视图必须是唯一的ID。 - Nicoli
显示剩余2条评论

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