Answers:
您忘记设置UIScrollView的contentSize属性。奇怪的是,您无法在Interface Builder中执行此操作。您将必须从管理此滚动视图的视图控制器中执行此操作。
contentSize
type 的条目Size
并设置所需的值来进行设置。
contentSize
滚动视图的设置(至少作为默认行为),我仍然感到困惑。
Boby_Wan的答案引起了我的思考,我找到了以下解决方案来从Interface Builder配置UIScrollView的contentSize:
UIScrollView
在情节提要场景中选择contentSize
Size
例如,将值设置为{320,920}将使用户向下滚动iPhone上的整个额外屏幕。
(我使用的是xcode 4.3.3,该项目的iOS部署目标为5.1)
第一次执行此操作时,收到以下错误:
非法配置:
大小类型的用户定义的运行时属性,具有4.3
MainStoryboard.storyboard 之前的Xcode版本
如果您也收到此错误,则很容易解决:在“ 项目浏览器”中选择“情节提要” ,然后打开“ 文件”检查器。查找/展开“ 界面生成器文档”部分,然后有一个“ 开发”下拉列表。确保将其设置为Xcode 4.3
"this class is not key value coding-compliant for the key keyPath"
,请您能帮助我我在做什么错?请注意,我使用xamarin-ios-c#
使用自动布局(iOS6 +),您可以避免设置contentSize
。设置以下约束:
contentSize
不适用于Xcode 5和iOS 7
您可以仅使用Interface Builder进行操作,转到Identity Inspector(第三个检查器选项卡),然后使用以下命令添加新的User Defined Runtime属性:
现在有一种方法可以使 UIScrollView
无需离开Storyboard即可滚动:
UIScrollView
在情节提要中选择,转到尺寸检查器和更换底部的值(或者任何你需要改变其他值)内容插图部分内容区域的高度。contentSize
。没关系填写类型或值(甚至可以保留其默认值)。UIScrollView
尽管我不知道为什么第二步是必要的(我偶然发现),但这将使工作正常进行。:(
我过去使用的一种方法是在界面生成器中将滚动视图拖出包含视图的位置,并将其实际大小设置为想要的contentSize。
接口构建器在本质上不是显而易见的是,您可以具有存储在笔尖中的未关联视图,但是这些视图不是笔尖主要用于的主视图的一部分。
在希望滚动视图存在的视图中,放置一个简单的UIView,用作占位符。(这仅仅是为了使您可以直观地设计它的位置。如果您只是使用整个视图,则可以跳过此步骤,并使用此答案末尾提供的第二个代码段)。
然后,您可以使用控件填充滚动视图,以可视方式将其布局为您希望的样子。在视图控制器中同时提供占位符和scrollview属性,以便您在运行时对其进行访问。
在运行时,在-(void)viewDidLoad中
scrollView.contentSize = scrollView.frame.size;
scrollView.frame = placeholder.frame;
[placeholder.superview addSubView:scrollView];
[placeholder removeFromSuperview];
或者(如果您不使用占位符):
CGRect f = self.view.frame;
scrollView.contentSize = f.size;
f.origin.x = 0;
f.origin.y = 0;
scrollView.frame = f;
[self.view addSubView:scrollView];
最后,如果您在界面构建器中“丢失”了滚动视图(可以将其关闭以使其从设计网格中消失),请不要惊慌。只需在设计网格左侧的对象列表中单击它即可。
在使用自动布局的Xcode 4.5中,我的大小检查器中没有“内容插入”部分。因此,我必须将其添加到“用户定义的运行时属性”下,然后才能正常工作。
在“用户定义的运行时属性”中添加的是keyPath == contentInset,其类型为“ Rect”(UIEdgeInsets,其输入与Rect相同),并定义为{top,left},{bottom,right}。contentSize仅定义滚动视图窗口的区域。contentInset定义可滚动区域。
我希望这对处于相同情况的人有所帮助。
上面的许多答案都是误导或过时的。截至2017年(可能更早),界面生成器确实支持具有自动调整大小的内容的滚动视图。诀窍在于,XCode为滚动视图与其内部内容之间的约束提供了特殊的非标准含义。这些“向内”约束实际上不会像您期望的那样实际影响内容的大小。
这意味着您可以例如将滚动视图固定在主视图的底部,且边距为零,也可以将滚动视图的内容固定在滚动视图的底部,边距为零,但是实际上并不会因此而被拉伸。取而代之的是,内容将获得其自己确定的大小(更多信息,请参见下文),这也将是滚动视图内可滚动区域的大小。
这样想吧-将约束绑定到滚动视图有一个不对称性:从滚动视图到“外部”(父)世界的约束通常确定滚动视图的大小和位置。但是滚动视图“内部”的约束实际上是通过将滚动视图绑定到内容来设置滚动视图的可滚动区域的大小和位置的。
这完全不是显而易见的,因为当您设置约束时,XCode会始终建议当前间距,而您有可能以冲突的方式有意地更改向内和向外的约束,这可能永远不会发生。但是您可以并且它们具有上述含义:一个控制滚动视图的布局,另一个控制可滚动内容区域的大小。
我偶然发现了这一点,然后看到它的工作原理使我进入这篇文章,对其进行了完整的解释,并为此引用了苹果文档来源:
https://spin.atomicobject.com/2014/03/05/uiscrollview-autolayout-ios/
关于内容的自己确定的大小的最后一个关键信息是:您可能会觉得自己陷入了困境,因为您通常将内容的大小调整为例如父视图的宽度,但是在这种情况下,父视图是scrollview和如上所述-约束不会影响您的内容大小。这里的答案是要记住,您可以将项目限制为视图层次结构中不直接相邻的项目:例如,您可以将内容视图的宽度设置为主视图的宽度,而不是徒劳地尝试使scrollview做到这一点为了你。
通过Interface Builder设置UIScrollView并不直观。这是我进行设置的清单:
选择UIViewController的XIB文件。在界面构建器的“身份检查器”中,将UIView更改为类类型UIScrollView
在“文件检查器”下,取消选中“自动布局”
在“属性检查器”下,将大小更改为“自由格式”。然后,您可以手动拉伸滚动视图,也可以在“尺寸检查器”下指定自定义宽度和高度。
在“身份检查器”中,添加类型为“大小”的名为“ contentSize”的新用户定义的运行时属性,并将其更改为{320,1000}之类的值。您无法再通过编程方式进行设置,因此需要执行此步骤,以便Scroll View知道Scroll View的内容大于窗口的内容。
只需在滚动视图上删除autoLayout。那么代码就是这样简单:
scrollviewName.contentSize = CGSizeMake(0, 650);
只需在.h文件上创建一个iboulet属性,然后在.m文件上进行合成。确保启用滚动。
是的,st3fan是正确的,必须设置UIScrollView的contentSize属性。但您不应为此目的关闭自动版式。您可以轻松地仅在IB中使用自动布局设置UIScrollView的contentSize,而无需任何代码。
重要的是要理解,当不直接使用UIScrollView的autolayout contentSize时,它是基于UIScrollView的所有子视图的约束来计算的。您所需要做的就是为两个方向的子视图提供适当的约束。
例如,如果您只有一个子视图,则可以设置其顶部和底部到父视图的高度和空间(即本例中的scrollView)contentSize.height计算为总和
Vertical Space (aSubview.top to Superview.top) + aSubview.height + Vertical Space (aSubview.top to Superview.top)
contentSize.width是根据水平约束类似地计算的。
如果没有太多约束可以正确计算contentSize,则“视图控制器场景”项附近会显示一个红色小按钮,以告知布局歧义。
如果有许多子视图,则可能是“约束”的“链”:顶部到顶部的子视图,子视图之间的高度和空间以及最底部的子视图到底部,如Danyal Aytekin的答案。
但实际上,在大多数情况下,仅添加一个具有所需大小的空视图,并将scrollView的顶部,左侧,底部,右侧的空间设置为0更为方便。 您可以将此视图用作“内容视图”,即放置所有其他子视图在它上面,或者如果您已经有很多子视图并且不想再次移动它们并设置布局,则可以将此辅助视图添加到现有子视图中并使其隐藏。
为了使scrollView可滚动,计算出的contentSize必须大于scrollView的大小。
您可以在StoryBoard中使用自动版式设置UIScrollView。基本上,您需要的是:
这是设计ScrollView的解决方案,其内容完全大于Storyboard中的屏幕(嗯,几乎全部,您也需要添加1行代码)
创建一个新的Xcode项目
导航到Main.storyboard文件
从对象库中选择ScrollView。
设置ScrollView的框架。
添加另一个视图以滚动视图,并使框架与ScrollView相同。
现在要动态设置其高度和宽度,您可以在XIB中使用自动布局配置UIScrollView