【问题标题】:How to control depth in UIKit?如何在 UIKit 中控制深度?
【发布时间】:2020-11-29 12:14:44
【问题描述】:

我对 UIKit 中视图的“深度”有疑问。 ImageView 位于 TextField 的顶部,但我想要相反:顶部的文本字段。下面是显示问题的图像:

FWIW:在 SwiftUI 中,有 ZStack 可以让人们轻松定义什么之上的内容,但我正在寻找 UIKit 中的解决方案,因为这个项目是我正在做的一门学习 UIKit 的课程。

该项目位于 GitHub 上,名为 MemeEditor。此链接指向存在上述问题的提交。

谢谢!

【问题讨论】:

  • 在 UIKit 中,z-index 仅由视图在其父视图中的顺序指定,因此只需将带有图像的堆栈视图移动为第一个子视图。

标签: swift autolayout uikit


【解决方案1】:

我正在寻找 UIKit 中的解决方案,因为这个项目是我正在学习 UIKit 的课程。

根据您的问题,听起来您正在寻找一种在代码中执行此操作的方法。 UIView 包含许多可以让您更改子视图的 z 顺序的方法,例如 insertSubview(_:aboveSubview:)insertSubview(_:belowSubview:),但是由于您已经有两个现有的子视图,您可以使用 exchangeSubview(at:withSubviewAt:) 来交换文本视图的位置和subviews 数组中的图像。

【讨论】:

  • 我不知道`exchangeSubview(at:withSubviewAt:)`,不错!我不打算在代码中寻找一种方法来做到这一点......只是我在故事板中环顾四周并错误地认为它太难了(uikit中的新手日子,或者它可能只是违反直觉一开始?)
【解决方案2】:

其实我找到了两个解决方案:

代码解决方案

来自: How can I bring a view in front of another view, in Swift?

这样,我必须在视图控制器中添加这一行

self.view.bringSubviewToFront(textField)

Diff here

故事板解决方案

几天后,我收到了有关该项目的反馈,并且我了解了如何在情节提要中执行此操作。当视图在情节提要的层次结构中向下时,视图将显示在顶部。

所以,我从:

到:

并且代码有效。 FWIW 的差异是:

diff --git a/MemeEditor/Base.lproj/Main.storyboard b/MemeEditor/Base.lproj/Main.storyboard
index c4fbb55..18400ce 100644
--- a/MemeEditor/Base.lproj/Main.storyboard
+++ b/MemeEditor/Base.lproj/Main.storyboard
@@ -16,6 +16,14 @@
                         <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <subviews>
+                            <stackView opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="l0u-Hb-3mT">
+                                <rect key="frame" x="0.0" y="44" width="414" height="818"/>
+                                <subviews>
+                                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="JJT-iB-9fc">
+                                        <rect key="frame" x="0.0" y="0.0" width="414" height="818"/>
+                                    </imageView>
+                                </subviews>
+                            </stackView>
                             <textField contentMode="center" contentHorizontalAlignment="center" contentVerticalAlignment="center" placeholder="TOP MESSAGE" textAlignment="center" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="cOM-zN-T9a" userLabel="Top Text Field">
                                 <rect key="frame" x="10" y="84" width="394" height="49.5"/>
                                 <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
@@ -28,14 +36,6 @@
                                 <fontDescription key="fontDescription" name="HelveticaNeue-CondensedBlack" family="Helvetica Neue" pointSize="40"/>
                                 <textInputTraits key="textInputTraits" autocapitalizationType="allCharacters"/>
                             </textField>
-                            <stackView opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="l0u-Hb-3mT">
-                                <rect key="frame" x="0.0" y="44" width="414" height="818"/>
-                                <subviews>
-                                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="JJT-iB-9fc">
-                                        <rect key="frame" x="0.0" y="0.0" width="414" height="818"/>
-                                    </imageView>
-                                </subviews>
-                            </stackView>
                             <toolbar opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="OY4-30-dsi">
                                 <rect key="frame" x="0.0" y="813" width="414" height="49"/>
                                 <items>

【讨论】:

  • 如果此解决方案适用于您的情况,那很好,但 bringSubviewToFront(_:) 是一个非常生硬的工具 - 有时您不想将被遮挡的子视图一直移动到前面.
  • 感谢@Caleb 指出!我找到了另一个解决方案,所以我更新了响应以包含两者。
【解决方案3】:

复制你想放在前面的视图(⌘C),删除旧的并粘贴(⌘V)。

【讨论】:

  • 已经是这样了,但是不影响顺序。
  • 对于像我这样的 UIKit 初学者来说,这个答案没有得到很好的解释。几天后,我明白了故事板需要进行哪些更改。我需要使文本视图出现在故事​​板层次结构中(向下)之后。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
  • 2012-04-28
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
  • 2016-03-21
  • 2011-08-23
相关资源
最近更新 更多