如何在界面构建器中添加UIScrollView?

21

我在界面构建器中放置了所有的控件(许多标签、按钮等),我如何在界面构建器中将它们全部放入滚动视图中,以便我可以获得更多空间,并能够上下滚动以显示更多的控件?我是否必须通过编程来实现此功能?

10个回答

31

打开视图编辑器,在其中选择所有控件和标签等内容。然后在“编辑”菜单下,选择“嵌入”,然后选择“滚动视图”。

注意:在较旧的Xcode版本中,该选项位于“布局”菜单下,然后选择“嵌入对象...(滚动视图)”。


2
这个功能无法正常工作。现在所有内容都在UIScrollView中,但是当我加载应用程序时,什么也无法滚动。为什么? - erotsppa
10
在 IB 中,确保 ScrollView 的大小足够小,这样当您的应用程序运行时,整个内容都可以在视图中看到。换句话说,它的界限(bounds/frame)需要比它所在的视图更小或相等。然后,在您的应用程序中,您需要设置 ScrollView.contentSize = 包含所有按钮、标签等的视图的大小。这将大于您为 ScrollView 设置的框架/边框。如果一切都做得正确,那么您应该能够轻松滚动,而无需其他操作。 - mahboudz
我无法让它工作,但是在界面构建器中,您如何布局低于480高度的内容呢?它似乎不允许您拉伸窗口。 - erotsppa
1
我必须将我的视图设置为顶级视图,这样我就可以将其设置得尽可能大。然后,我必须将它们嵌入滚动视图中,然后将其移动到我的主视图中。更改东西很麻烦。我希望Interface Builder能让我们在自己的窗口中打开视图,而不是父视图的窗口。 - mahboudz
我不确定你是否在代码中执行了这一步骤,比如在你的视图控制器的viewDidLoad方法中设置scrollView.contentSize为更大视图的大小。这很重要。如果你仍然不明白,可以创建一个快速测试应用程序,只包含一个UIImageView和一个UIScrollView,并使用苹果的示例代码进行参考。 - mahboudz

25

我推荐的解决方案,其中您不需要硬编码contentSize的大小:


注意:您可以使用此方法避免此处的源代码部分:https://dev59.com/G3NA5IYBdhLWcg3wAItP#11239123 - 尽管我尚未尝试过。

其余的技巧...仍然需要使用


  1. 将所有控件移动到单个UIView中(在IB中:选择所有控件,然后转到Layout> Embed Objects In ...> View)

  2. 使用IBOutlet属性将该单个UIView连接到源代码(请参见下文)

  3. 在源代码中而不是界面构建器(IB在这里有问题,它设置UIScrollView的原点位置不正确-它试图居中视图。Apple从未检查过它是否存在基本错误,叹气):将单个UIView移动到UIScrollView中(请参阅下面的代码)。

  4. 使用sizeThatFits来“自动”设置正确的大小。

代码(StackOverflow不允许我在编号列表中放置代码。叹气)

头文件:

/** outlet that you hook up to the view created in step 1 */
@property(nonatomic, retain) IBOutlet UIView *masterView;

类文件:

/** inside your viewDidLoad method */
[scrollview addSubview: masterView]; // step 3
scrollView.contentSize = [masterView sizeThatFits:CGSizeZero]; // step 4

虽然我最近没有检查过,但我记得它适用于2.x和3.x


这在4.x上也很好用 - 我仍然在应用程序中使用它,没有任何问题。 - Adam
这个在iOS 4.2的iPhone上可以工作。不要忘记UIScrollView的高度应该与ViewController的顶级UIView相同或相等。我一直在调整设置,忘记改回来了。因为它似乎仍然会弹到错误的位置,所以我感到困惑。 - brian.clear
在这里调用sizeThatFits是没有意义的。将滚动视图的contentSize设置为主视图的大小就足够了。 - matt
@matt - 如果我没记错的话,在旧版SDK上它并不能正常工作(尽管文档让人觉得它应该能够工作)。如果现在可以工作,那太好了。 - Adam
谢谢你提供这个好主意!我发现你可以像那样格式化一个 UIView 并将其添加到 UIScrollView 中(尽管我花了很多时间试图将所有内容放入一个过大的 UIScrollView 中),但我从未想过使用 sizeThatFits: 方法!太棒了! - msgambel

4

很简单:

首先在您的视图中添加一个滚动视图。 更改滚动视图的大小(例如,使其长700像素)。 开始放置您的控件。 当您想要在下部(不可见)部分放置/编辑控件时,请选择滚动视图并将Y起始位置更改为-300。 完成! 编辑后将Y起始位置设置回0或任何其他值。


或者,您可以只是增加大小,然后再次减小。滚动会很好,但我并不惊讶它没有被实现。 - Casebash
如果您这样做,那么您还必须手动(重新)设置滚动视图的“frame”大小为页面的视图大小(视图门户),并将“contentSize”设置为总内容大小。后者默认为0,0,如果contentSize不大于frame.size,则不会发生滚动。这是一个很好的额外策略,与其他两种方法一起使用效果更佳,感谢! - Hari Honor

4

不知道是不是只有我一个人,但我尝试跟着其他答案中的每一个指示去操作,但都没有成功。每个答案都没有包含所需的全部内容,可能是假设我们知道该怎么做而省略了那一部分。最终,在red artisan的帮助下,我弄清楚了该如何实现:

  1. 在InterfaceBuilder中添加一个View,然后向其中添加控件(或者如果你的控件已经存在于主视图中,可以选择所有的控件,然后转到Editor | Embed In | View,再将该新的View拖动到它自己以外的位置)。这个View可以是任意大小。

  2. 在InterfaceBuilder中,向主视图添加一个滚动视图,并将其大小调整为占用整个主视图。

  3. 将以下代码添加到您的UIViewController Header和Class文件中。

  4. 在InterfaceBuilder中,将包含控件的View连接到File's Owner中的'contentView'。将滚动视图连接到File's Owner中的‘scrollView’。

Header 文件:

    @interface MyViewController : UIViewController
     @property(nonatomic, retain) IBOutlet UIScrollView *scrollView;  
     @property(nonatomic, retain) IBOutlet UIView *contentView;  

Class 文件:

    @synthesize scrollView, contentView;
- (void)viewDidLoad { [super viewDidLoad]; [self.scrollView addSubview:self.contentView]; self.scrollView.contentSize = self.contentView.bounds.size; }
- (void)viewDidUnload { self.scrollView = nil; self.contentView = nil; [super viewDidUnload]; }

4

选择您想要放入滚动视图中的所有对象,然后转到布局菜单,选择“嵌入对象”并选择“滚动视图”。


1

重要的小事情。 如果需要在UIScrollView中滚动大的子视图(例如UIImageView),请记住,在Interface Builder的视图窗口中,对于这个子视图,取消选中“用户交互启用”复选框。或者可以通过编程方式实现。

subview.userInteractionEnabled = NO;

否则,这个子视图将会堆叠在屏幕上而没有任何效果。

1

尽管这个问题非常老,我想提供一个解决方法,因为我也遇到了同样的问题并找不到太多帮助:

在IB中,如果您想将对象放置在420像素之外,请确保对包含滚动视图和所有对象的视图的状态栏、顶部栏和底部栏都选择了未指定。这样,您就可以手动调整屏幕大小(对于视图)。然后,您可以按照Ximonn的建议调整滚动视图的H值,并访问所有其他对象,在与它们一起工作后撤销H值的更改,然后设置所需的栏。


0

我知道,这个帖子有点旧了...但是有人可能在谷歌上找到它,因为它排名很高。 我编写了这个小助手方法来完成工作:

- (void)addSubview:(UIView *)theSubView toScrollView:(UIScrollView *)theScrollView
{
    [theScrollView addSubview:theSubView];
    theScrollView.contentSize = theSubView.bounds.size;
}

在头文件中声明两个IBOutlet(例如contentViewscrollView),并在需要将UIView加载到UIScrollView的源代码中调用此方法:

[self addSubview:contentView toScrollView:scrollView];

我在viewDidLoad中调用了它

此方法适用于iOS


0

我已经寻找了几天,最终在这个网站上找到了一个对我有用的解决方案。

使用UIScrollView滚动

基本上,你需要在主视图中添加一个UIScrollView对象,然后再添加另一个包含所有内容的内容视图。接着将内容视图添加到滚动视图中,并将滚动视图的内容大小设置为内容视图的大小。


0

对于Xcode 3,所选答案效果良好。

然而,对于Xcode 4,菜单略有重新排列。

要在Xcode 4中执行相同操作,请选择您的视图,然后使用:

编辑器 > 嵌入 > 滚动视图


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