给现有视图添加一个滚动视图

35
我正在使用Swift 2.0开发一个小应用程序。我有一个视图,其层次结构如下:

enter image description here

现在,放置在该视图中的元素无法完全显示,因此我想使用ScrollView来滚动所有内容。 我如何将我的View的所有内容嵌入到新的ScrollView中? 我可以通过编程方式进行操作吗?

1
可能是将UIScrollView添加到UIViewController的重复问题。 - Ronak Chaniyara
你可以从Storyboard中添加scrollView,但是一旦这样做,你必须为scrollView内添加的所有视图设置约束。你不能只添加scrollView并期望它会滚动。 - Bharat Modi
2
要嵌入ScrollView,请选择您想添加到ScrollView中的所有视图,然后转到Editor - EmbedIn - ScrollView。 - Bharat Modi
我尝试按照@BharatModi所说的将所有视图元素嵌入ScrollView中,但它无法滚动。我需要添加其他内容吗?如果可能的话,我想通过“代码”找到解决方案,避免我再次设置所有约束。 - giograno
请按照以下网址中提到的步骤进行操作:https://dev59.com/y1sV5IYBdhLWcg3w6ych#35625897 - Bharat Modi
1
上述提到的问题不是重复的。这是一个非常古老的问题,答案是关于Obj-C和自动调整大小的。 - Sulthan
6个回答

58

更新:当我发布这个答案时,我不知道还有更简单的方法

1)进入视图控制器,并点击其中的某个元素,按下Command + A。这将选择视图中的所有元素。

2)转到 Editor -> Embed In -> Scroll View。这将把所有标签、视图等嵌入到一个 scrollView 中。

3)选择刚刚嵌入的 scrollview。按住Control并将其拖到视图控制器的相应类文件中,并创建一个 outlet scrollView

4)将以下内容添加到您的 viewDidLoad() 中:

scrollView.contentSize = CGSizeMake(self.view.frame.width, self.view.frame.height+100)

确保contentSize的高度大于视图的大小。

手动添加SCROLLVIEW

1)从Object Library中拖放一个scrollview到Storyboard中的viewcontroller上,并将其作为“scrollView”创建一个代码连接。

2)单击viewcontroller,进入尺寸检查器,记录宽度和高度。

3)单击scrollview并将widthheight设置为与viewcontroller相同。并将XY值设置为0

4)点击scrollView并将其稍微向一边拖动一下

5)按Command+A选择所有元素,包括scrollView。 按住Command键并单击scrollView以取消选择ScrollView

6)现在您将拥有除scrollView之外的所有元素。 现在将它们点击并拖放到scrollView中。

Moving into scrollView

7)现在单击scrollView并从尺寸检查器中将XY值设置为0。

8)将此添加到viewDidLoad()

scrollView.contentSize = CGSizeMake(self.view.frame.width, self.view.frame.height+100)

确保contentSize的高度大于视图大小。

这将为您的视图创建一个scrollView。一些元素可能会处于略微不同的位置。您可以在storyBoard中移动它们来轻松解决问题。


我在将视图元素嵌入scrollView后,是否重新设置了所有约束? - giograno
我不这么认为。你只需要设置scrollview的约束条件。 - ebby94
非常好的回复。这样做可以避免很多麻烦,保持现有的约束不变,但是在添加滚动视图之后,所有元素之间与父视图之间的约束都将消失。因此,之前是父视图->各个元素,现在是父视图->滚动视图->各个元素。因此,所有最初的元素和父视图之间的约束现在都将被滚动视图和元素所取代,并且我们还需要在滚动视图和父视图之间添加新的约束。 - EmbCoder
4
目前(Xcode 8,iOS 10),您应该使用 self.view.frame.size.widthself.view.frame.size.height 属性。 - ArtStyle
正是我所需要的。虽然不得不将 CGSizeMake(self.view.frame.width, self.view.frame.height+300) 更改为 CGSize(width: self.view.frame.width, height: self.view.frame.height+300) - Chris

8
可以比ebby94的答案更简单地完成。
1)进入故事板上的视图控制器,点击其中的任何元素,然后按Command + A。这将选择视图中的所有元素。
2)转到编辑器 -> 嵌入 -> 滚动视图。这将把所有标签、视图等嵌入到一个滚动视图中。
3)将滚动视图的约束设置为视图的边缘。
完成了!不需要输出口。

2
在第三步中,我设置了4个约束条件:前导、尾随、顶部布局指南、底部布局指南。我收到了一个警告,上面写着:“滚动视图的可滚动内容大小不明确。” - Mark Moeykens
你确定之前的步骤都做对了吗? - FredFlinstone
1
编辑器 > 嵌入 > 滚动视图被禁用,所以这对我没有起作用。 - Dale
1
@Dale 注意,不要选择安全区域! - Sean Stayns
@MarkMoeykens 的技巧是将 View 添加到 scrollView 中,并将内容添加到 View 中!请看这个线程:https://dev59.com/BW855IYBdhLWcg3wjlKL#54577278 - Sean Stayns

3

如果你正在使用Snapkit或以编程方式创建。

class ScrollViewController: UIViewController {

lazy var contentViewSize = CGSize(width: self.view.frame.width, height: self.view.frame.height + 320) //Step One

lazy var scrollView : UIScrollView = {
    let view = UIScrollView(frame : .zero)
    view.frame = self.view.bounds
    view.contentInsetAdjustmentBehavior = .never
    view.contentSize = contentViewSize
    view.backgroundColor = .white
    return view
}()

lazy var containerView : UIView = {
    let view = UIView()
    view.frame.size = contentViewSize
    view.backgroundColor = .white
    return view
}()

override func viewDidLoad() {

    self.view.addSubview(scrollView)
    self.scrollView.addSubview(containerView)

    //Now Set Add your Constraints in the container View.

}
}

以上被接受的回答的解释已足以实现滚动视图,但我更喜欢在我的项目中完全使用编程方式创建并且不使用故事板。这段代码是为那些不想使用故事板的人准备的。
解释:
第一步:确定您的内容大小。在这里,我采用了精确的宽度并将屏幕高度增加了320。
第二步:创建滚动视图并添加所需的滚动视图行为。现在,滚动视图的contentSize应与您在第一步中创建的contentSize相同。
通过遵循第一步和第二步,您将能够在视图顶部设置一个滚动视图。但如果您想添加拉伸行为,则应遵循第三步。
第三步:创建与您在第一步中计算的内容视图大小相同的容器视图,并将其设置为容器视图的框架。通过这样做,您将能够在屏幕上实现拉伸头部和脚注行为。
请务必按照相同的顺序添加约束。
欢迎进行答案编辑。

2

我曾经也遇到了同样的问题。我需要在现有视图中添加滚动视图。但是我的主容器视图里面有很多子视图,它们之间都是相互连接的。所以我很担心。最终我还是做到了,下面是具体步骤:

  1. 复制你的视图(根视图)。首先选择根视图,然后按下 Command + D 复制。

  2. 现在删除根视图内所有子视图。

  3. 现在在根视图中添加滚动视图,并将其约束设置为 0,0,0,0。

  4. 现在将你复制的视图添加到滚动视图中,并将其约束设置为 0,0,0,0,同时设置你想要的高度。

  5. 通过与根视图等宽来设置复制视图的宽度。

  6. 现在选择 viewController,进入大小检查器,在自由形式大小中进行选择。然后设置与复制视图输入的高度相同的高度。

  7. 你已经完成了大部分工作。现在你需要将子视图与在 viewController 类中指定的 outlet 或 action 进行连接。

就这些了。


1
选择所有元素并嵌入滚动视图(编辑器->嵌入->滚动视图)可以正常工作。
通过选择约束警告(添加缺失约束)来添加约束更加容易。

0
很简单。在故事板中为特定的视图控制器分配命令A和命令X。然后使用滚动视图。在滚动视图上,只需取一个视图,其视图控制器视图高度和宽度等于滚动视图宽度。再次执行命令V并重新排列约束条件。这样就能解决您的问题了。

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