如何在情节提要中使用UIScrollView


125

我有一个滚动视图,其内容高度为1000px,并希望能够将其布局以便在情节提要板上进行轻松设计。
我知道可以通过编程方式完成,但是我真的希望能够以视觉方式看到它。每次将滚动视图放在视图控制器上时,它都不会滚动。是否有可能让它按我想要的方式工作,还是必须在代码中进行?


1
大家好,请参阅下面的评论以了解执行此操作的新方法。我两年前写了这篇文章,xCode发生了很大变化。现在有其他方法可以执行此操作,因此请注意。评论中建议使用iOS 7和iOS 8解决方案
Alex Reynolds 2015年

再过2年后,仍然有关于此方法不起作用或自动布局更好的评论。最初的问题是如何在ios 5/6中做到这一点。这些天我只使用自动布局,因此您也应该/也可以。有关自动布局的信息,请参见答案。如果有帮助,请升级自动版式答案。谢谢大家
亚历克斯·雷诺兹

Answers:


149

我正在回答自己的问题,因为我只花了2个小时来找到解决方案,而StackOverflow允许这种QA样式。

从这里开始完成是如何使其在情节提要中起作用。

1:转到您的视图控制器,然后单击Attribute Inspector

2:将“大小”更改为Freeform“推断”。

3:转到该故事板上的主视图,而不是滚动视图,而是顶层视图。

4:单击Size Inspector并将此视图设置为所需的大小。我将身高更改为1000。

现在,您将看到情节提要板具有您的视图设置,因此您可以看到滚动条的整个高度,以方便设计。

5:放在滚动视图上并拉伸它,使其占据整个视图。现在,您应该在视图控制器中的视图上拥有一个大小为320,1000的滚动视图。

现在,我们需要使其滚动并使其正确显示内容。

6:单击滚动视图,然后单击Identity Inspector

7:添加一个User Defined runtime attribute带有KeyPath的contentSizeSIZE类型,然后输入您的内容大小。对我来说是(320,1000)。

由于我们希望在情节提要板上看到整个滚动视图,因此我们对其进行了拉伸,它具有320,1000的框架,但是为了使其在我们的应用程序中正常工作,我们需要将框架更改为可见的滚动视图。

8:添加一个runtime attribute带有KeyPath的frameRECT类型和0,0,320,416。

现在,当我们运行我们的应用程序时,我们将看到一个可见的滚动视图,其框架为0,0,320,416,并且可以向下滚动到1000。我们能够以我们希望它们出现的方式在Storyboard中布置子视图和图像以及其他内容。然后,我们的运行时属性确保正确显示它。所有这些都没有1行代码。


5
如果正确使用了滚动视图自动调整大小功能,则无需定义frame属性。实际上,并非所有设备都具有完全相同的尺寸(iPhone 5)。
Tronix117 2013年

Tronix117,那么如果没有该属性,您如何解决此问题?
Andras Hatvani 2013年

2
如果您有iOS 7的解决方案,请告诉我。这个答案是一年多以前在iOS 7之前发布的。我被淹没了,否则我将为iPhone5和ios7更新它
Alex Reynolds

2
注意:FOR iOS7的解决方案低于 stackoverflow.com/a/22489795/1553014
Raja Rao

1
注:对于iOS 8.3的XCode 6.3,答案就在这里:stackoverflow.com/questions/26742230/...
T.Coutlakis

51

以下是Auto Layout在XCode 8.2.1上对我有用的步骤。

  1. 选择Size InspectorView Controller,并改变Simulated SizeFreeform与高度1000的代替Fixed
  2. 将的视图重命名View ControllerRootView
  3. 拖动Scroll View作为RootView的子视图并将其重命名为ScrollView
  4. ScrollView添加约束:
    • ScrollView [顶部,底部,前导,尾随] = RootView [顶部,底部,前导,尾随]
  5. 拖动ScrollViewVertical Stack Viewas子视图并将其重命名为ContentView
  6. ContentView添加约束:
    • ContentView .height = 1000
    • ContentView [顶部,底部,前导,尾随,宽度] = ScrollView [顶部,底部,前导,尾随,宽度]
  7. 选择Attributes Inspector内容查看,并改变DistributionFill Equally代替Fill
  8. 拖动一个ContentViewView子视图并将其重命名为RedView
  9. 设置RedRedView的背景。
  10. 拖动一个ContentViewView子视图并将其重命名为BlueView
  11. 设置BlueBlueView的背景。
  12. 选择RootView,然后单击Update Frames按钮。
    • Update Frames是Xcode8中的新按钮,而不是Resolve Auto Layout Issuesbutton。它看起来像一个刷新按钮,位于情节提要板下方的控制栏中: 更新框架按钮

视图层次结构:

  • 根视图
    • 滚动视图
      • 内容查看
        • 红景
        • 蓝景

查看控制器场景(高度:1000):

现场

在iPhone7上运行(高度:1334/2):

演示


我有同样的问题,想知道当我的滚动视图不是rootview的大小时,这是否可行?
GalaxyVintage

但问题是,ipad的底部将有一个空白空间
G.Abhisek

对于像我这样的初学者(Xcode 8.2),将BlueView'top 设置为's top的注意事项RedView:1)拖动BlueView 以下内容 RedView(即它们不应重叠或第4步)将不起作用。2)打开底部的图钉菜单。3)单击顶部边距约束右侧的小箭头。4)选择RedView从菜单并将其值设置为0。这是对先前版本的Xcode的不同,你可以做这样的事情Editor- > Pin- > ...
Krøllebølle

只是好奇,为什么您使用垂直堆栈视图而不是常规的UIView?
Changerrs

我使用@Changerrs UIStackView来避免设置约束的麻烦。
jqgsninimo

43

以下是在iOS 7和XCode 5上对我有用的步骤。

  1. 拖动一个ViewController(它随UIView“视图”一起提供)。

    1.1选择“视图控制器”,然后选择“文件检查器”,然后取消选中“自动布局”。

  2. 拖动ScrollView(作为ViewController的UIView“视图”的子级)
  3. 选择ScrollView并打开“身份检查器”。
  4. 输入keyPath的“ contentSize”。选择“大小”作为类型。然后输入{320,1000}作为值。

    注意:步骤4只是说滚动条包含一些内容,其大小为320x1000单位。因此,设置contentSize将使滚动条起作用。

  5. 选择“视图控制器”,选择“属性检查器”,然后从“大小”中选择“ 自由格式 ” 。

    注意:第5步将允许我们更改视图控制器随附的“视图”的大小。

  6. 选择“查看”,然后选择“尺寸检查器”。

  7. 将“宽度”设置为320,将“高度”设置为1000。

注意:5、6和7纯粹是让我们在StoryBoard中看到拉伸或整个展开的视图。注意:确保在View Controller上取消选择“自动布局”。

您的视图层次结构应如下所示: 等级制


3
从Xcode 6.1和iOS 8.1开始,该技术仍然有效。
克里斯·哈里斯

1
惊人。谢谢你 绝对可以在Xcode 6.1和iOS 8.1上使用。
Shanker Kaura 2014年

45
好的...如果我们需要自动布局怎么办?
PostCodeism 2014年

1
更好的答案..谢谢!
StefMa 2014年

1
解决方案适用于iOS 8自动布局和大小类stackoverflow.com/questions/26742230/...
jithin

13

经过数小时的反复试验,我发现了一种非常简单的方法将内容放入“屏幕外”的滚动视图中。经过XCode 5和iOS 7的测试。您可以使用2个小技巧/变通办法,几乎完全在Storyboard中完成此操作:

  1. 将一个视图控制器拖到您的情节提要上。
  2. 在此viewController上拖动一个scrollView,对于演示,您可以将其大小保留为默认值,覆盖整个屏幕。
  3. 现在来了技巧1:在将任何元素添加到scrollView之前,将其拖动到常规的“视图”中(该视图将比屏幕大,并将包含所有子元素,例如按钮,标签,...让我们将其称为' 封闭视图 ')。
  4. 在大小检查器中将此封闭视图的Y大小设置为例如800。
  5. 将标签放到封闭的视图中,在Y位置200的某个位置,将其命名为“标签1”。
  6. 技巧2:确保选择了封闭的视图而不是scrollView!),并将其Y位置设置为例如-250,以便您可以在屏幕“外部”添加一个项目
  7. 在屏幕底部的某个地方放入一个标签,命名为“ label 2”。此标签实际上是“屏幕外”。
  8. 将封闭视图的Y位置重置为0,您将不再看到标签2,因为它位于屏幕之外。

到目前为止,对于情节提要板的工作,现在您需要向viewController的'viewDidLoad'方法中添加一行代码,以设置scrollViews内容,使其包含整个“封闭视图”。我在Storyboard中找不到实现此目的的方法:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.scrollView.contentSize = CGSizeMake(320, 800);
}

您可以尝试通过将contentSizekeyPath 添加为size到Identity Inspector中的scrollView并将其设置为(。

我认为苹果公司应该使这在故事板中更容易些,在TableViewController中,您可以在故事板中进行屏幕外滚动(只需添加20个单元格,您会看到您可以简单地滚动),这也可以通过ScrollViewController来实现。


1
这是正确的jaxvy,当我最近将应用程序移植为支持自动布局时,我已用静态表格视图替换了滚动视图。做同样的工作,也有一些额外的优势。
Ronny Webers 2014年

动态更改contentSize会怎么样,因为所有iPhone都具有不同的大小
veeresh kumbar

8

在iOS7中获得滚动功能,在iOS 7和XCode 5中获得自动布局功能。

除此之外:https : //stackoverflow.com/a/22489795/1553014

显然,我们需要做的是:

  1. 将所有约束设置为“滚动视图”(即先修复滚动视图)

  2. 然后将distance-from-scrollView约束设置为最底部的项目以滚动视图(超级视图)。

注意:第2步将告诉情节提要板最后一块内容在“滚动”视图中的位置。


7

对于此示例,我未选中“界面”构建器的“自动布局”功能。而且,我仍在使用(完全没有理由)相对较旧的Xcode 4.6.1版本。

从一个具有滚动视图(主视图)的视图控制器开始。

1:将对象库中的容器视图添加到滚动视图。请注意,新的视图控制器已添加到情节提要中,并且已通过滚动视图链接到视图控制器。

2:选择容器视图,然后在“大小”检查器上将其固定到顶部和左侧,而无需自动调整大小。

在此处输入图片说明

3:将其高度更改为1000。(本示例使用1000。您应该应用所需的值。)

4:选择新的视图控制器,然后从“属性”检查器中将“大小”更改为“自由格式”。

在此处输入图片说明

5:选择新视图控制器的视图,然后在Inspector大小上将高度更改为1000(等于容器视图的高度)。

6:为了以后进行测试,当仍在新视图控制器的视图上时,在视图的顶部和底部添加标签。

7:从原始视图控制器中选择滚动视图。在身份检查器上,添加一个属性,其keyPath设置为contentSize,类型设置为Size,值设置为{320,1000}(或容器视图的大小)。

在此处输入图片说明

8:在4英寸iPhone模拟器上运行。您应该能够从顶部标签滚动到底部标签。

9:在3.5英寸iPhone Simulator上运行。您应该能够从顶部标签滚动到底部标签。

请记住,Xcode 4.6.1只能针对iOS6及更低版本进行构建。使用此方法并针对iOS6进行构建,当该应用程序在iOS7上运行时,我仍然可以获得相同的结果。


5

请注意,在中UITableView,您实际上可以通过选择单元格或其中的元素并使用触控板向上或向下滚动来滚动表格视图。

对于a UIScrollView,我喜欢Alex的建议,但我建议暂时将视图控制器更改为自由格式,增加根视图的高度,构建您的UI(步骤1-5),然后在完成后将其更改回标准推断的大小。这样您就不必将内容大小硬编码为运行时属性。如果这样做,您将面临很多维护问题,试图同时支持3.5英寸和4英寸设备,以及将来可能会提高屏幕分辨率。



4

免责声明:-仅适用于ios 9及更高版本(堆栈视图)。

如果要在ios 9设备上部署应用程序,请使用堆栈视图。步骤如下:-

  1. 添加具有约束的滚动视图-固定到左,右,下,上(无边距)以显示超级视图(视图)
  2. 添加具有相同约束的堆栈视图以滚动视图。
  3. 堆栈视图其他约束:-stackView.bottom = view.bottom和stackView.width = scrollView.width
  4. 开始添加您的视图。滚动视图将根据堆栈视图的大小决定滚动(本质上是您的内容视图)

1
这是一种有用的技术,它可以最大程度地减少您必须手动添加的约束数量。通常,滚动的方法是确保有足够的约束用于自动布局以计算内容的大小。堆栈视图为您带来了很多约束。设置堆栈spacing以在子视图(子视图)之间放置一些空间。如果仅两个子视图之间需要更多空间,请添加“ spacer”子项:具有固定大小的透明UIView。
制造商史蒂夫(Steve)

4

在iOS7中,我发现,如果我在FreeForm大小的ViewController的UIScrollView内有一个View,无论我做什么,它都不会在应用程序中滚动。我到处玩耍,发现以下内容似乎有效,它不使用FreeForms:

  1. 在ViewController的主视图内插入UIScrollView

  2. 根据需要在ScrollView上设置Autolayout约束。对我来说,我使用了0到顶部布局指南和0到底部布局指南

  3. 在ScrollView内部,放置一个Container View。将其高度设置为任意值(例如1000)

  4. 向容器添加一个高度限制(1000),以使其不会调整大小。底部将超过表格的结尾。

  5. 添加行[self.scrollView setContentSize:CGSizeMake(320,1000)]; 到包含scrollView的ViewController(您已将其作为IBOutlet连接)

与Container关联的ViewController(自动添加)在Interface Builder中将具有所需的高度(1000),并且还将在原始视图控制器中正确滚动。现在,您可以使用容器的ViewController来布局控件。


我赞成这个答案,因为我喜欢这项技术。但是,我认为无论iOS版本如何,FreeForm VC都会干扰滚动,这是错误的。从iOS 6(添加了自动版式)开始,滚动出现其他约束中所述的一整套约束。我认为FreeForm不会对此造成干扰(尽管我还没有尝试过)。也许您缺少一些非显而易见的约束;ScrollView + AutoLayout有点不足。
ToolmakerSteve

3

我想将5美分作为接受的答案:我已经研究主题2天了,终于找到了一种解决方案,从现在开始我将一直使用

在接受的答案中转到第4项,而不必添加框架和contentsizes等属性

使一切自动化,只需使用此链接中的解决方案

一切都清晰,轻松,优雅,并且像ios 7上的魅力一样工作。



您的解决方案(如果您跟踪到末尾的链接)涉及添加一行代码,因此这与问题特别不符-仅使用情节提要
Boris Gafurov

@BorisGafurov还是跟ios7有点过时了。和mb不一致,但是我确信无论如何它已经帮助了几位ppl。所以就这样吧
jungle_mole

3

这是一个简单的解决方案。

  1. 在情节提要中将视图控制器的大小属性设置为“自由格式”,然后设置所需的大小。确保它足够大以适合滚动视图的全部内容。

  2. 添加滚动视图并按照通常的方式设置约束。即,如果您希望滚动视图成为视图的大小,则可以像往常一样将顶部,底部,前导和尾随页边距附加到超级视图。

  3. 现在,只需确保在滚动视图的子视图中有连接滚动视图顶部和底部的约束即可。如果进行水平滚动,则左右方向相同。

在此处输入图片说明


2

对于垂直滚动视图,有一个肮脏的答案,可以得到相同的解决方案,但是(与stackoverflow的精神相反)不能回答这个问题。无需使用scrollView,只需使用UITableView,将普通的UIView拖动到标题中,然后使其达到所需的大小即可,现在可以在情节提要中滚动内容。


恕我直言,这是一个很好的答案,不违背stackoverflow的精神,建议一种替代方法(除非OP明确表示他们需要按照自己的方式进行。)而stackoverflow的最大价值在于帮助所有其他人并阅读问答。:)
制造商史蒂夫(Steve)


0

关键是contentSize。

添加UIScrollView时通常会丢失并且未指出这一点。

选择UIScrollView并选择“身份检查器”。

contentSizekeyPath作为a 添加size到Identity Inspector中的scrollView中,并将其设置为(320,1000)。

滚开。


这是一种方法,我自己使用过。但是,我不认为这是首选方法。提供一组完整的约束是“更干净/更灵活”的,这样自动布局可以自行计算内容大小。三种选择:从顶部到底部约束,或使用堆栈视图,或约束到底部项目的位置
ToolmakerSteve

0

如果您使用自动布局,则最好的方法是将UITableViewController与情节提要中的静态单元格一起使用。

我还曾经遇到过需要更多滚动的视图问题,因此请使用上述技术更改UIScrollView。


0

这是使用Xcode 11设置滚动视图的方法

1-添加滚动视图并设置顶部,底部,前导和尾随约束

在此处输入图片说明

2-将内容视图添加到滚动视图,将连接拖动到“内容布局指南”,然后选择“前导”,“顶部”,“底部”和“尾随”。确保将其值设置为0或所需的常数。

在此处输入图片说明

3-从“内容视图”拖动到“帧布局指南”,然后选择“等宽”

在此处输入图片说明

4-将高度限制常数设置为“内容”视图

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.