使用界面构建器创建UIScrollView的步骤

13

我正在尝试使用UIScrollView,但似乎有一些基本的东西我不理解。

假设我想在我的iPhone应用程序中使用UIScrollView。 我有一个填充了按钮的View,大小为320x700。 很明显,这对于尺寸为320x480的iPhone来说太大了。 所以我知道我必须使用UIScrollView。 然而,这是我应该创建对象的顺序吗?

  1. 创建一个大小为320x700的UIScrollView作为“View”中的尺寸
  2. 将所有按钮等内容放在此滚动视图上
  3. 在viewDidLoad中将contentSize设置为320x700
  4. 将UIScrollView的代理设置为文件所有者,将FileOwner的视图设置为UIScrollView
  5. 将View的大小重置回320x480。

这样行得通,但我觉得没有道理。 我知道View应该是画布,在其中添加所有UI元素。 我希望iPhone应用程序的“画布”为320x700,并且我希望能够将我的按钮等内容放在这个320x700的“画布”上。 但是,如果我不将UIScrollView的大小更改为320x480,它就无法滚动,因为我需要将UIScrollView的内容大小设置为大于其大小。

但是,如果我将UIScrollView的大小设置为320x480,则在Interface Builder中无法看到480到700之间的屏幕和按钮! 因此,似乎我应该在UIScrollView上进行所有编辑和添加所有UI元素,然后将其设置回320x480!

有没有更合理的其他方法可行? 我在如何使这起作用方面缺少了解?

2个回答

44

更新

我在这里发布了另一个解决方案,我认为更简单更好。

原始内容

以下是另一种可能更适合你的方法:

  1. 将文件所有者占位符的自定义类设置为您的视图控制器子类。
  2. 在nib中创建UIScrollView作为顶级对象。将其大小设置为屏幕大小(320x460),或在“模拟指标”下打开状态栏就行了。
  3. 将滚动视图的delegate输出连接到文件所有者。
  4. 将文件所有者的view输出设置为滚动视图。
  5. 创建一个UIView作为您内容视图的另一个顶级对象。
  6. 将内容视图的大小设置为320x700。
  7. 在您的视图控制器(文件所有者)中创建一个强引用(如果不使用ARC,则保留)可命名为contentView的输出,并将其连接到内容视图。
  8. 将按钮放入内容视图中。
  9. 在您的视图控制器的viewDidLoad中,做以下操作:

    - (void)viewDidLoad {
        [super viewDidLoad];
        [self.view addSubview:self.contentView];
        ((UIScrollView *)self.view).contentSize = self.contentView.frame.size;
    }
    
    在你的视图控制器的viewDidUnload方法中,执行以下操作:
    - (void)viewDidUnload {
        self.contentView = nil;
        [super viewDidUnload];
    }
    

滚动按钮项目窗口
完整尺寸


谢谢!我现在更明白了……在运行时完成对视图的“拼接”,这样就不会干扰 Interface Builder 对内容视图的构建。还有一个问题,为什么要将滚动视图大小设置为 460?这是为了满足滚动视图必须小于 480 的要求吗? - steve8918
状态栏占用20个点。大小并不是很重要,因为UIViewController应该将其调整为全屏显示。 - rob mayoff
对于滚动视图,接口构建器浪费了我数小时的时间。最好是自己用代码构建,这样会更快。大多数情况下都是我的错,但在这种情况下,IB存在一些问题,会将所有内容的高度错位一个uinavigation栏的高度。我相信自己做得很对。我喜欢用代码来搭配一切。 - user798719
在viewDidUnload中为什么需要将contentView设置为nil? - Bradley Thomas
如果你的contentView outlet是strong类型,它会一直保持对视图的引用,除非你将其设置为nil。 - rob mayoff

5
你说得没错,View 是你添加所有 UI 元素的画布。一开始使用 Interface Builder 会感到有些奇怪,但你会逐渐习惯它,这就是它的工作方式。
你卡在了必须调整 ScrollView 大小的事实上。你应该这样想: ScrollView 有一个框架大小和一个内容大小。如果内容大小大于框架大小,它就会滚动。你需要在接口构建器中将框架大小设置为所需大小,以便定位放置在其中的元素。当你运行应用程序时,你应该将滚动框架的大小调整为适合 iPhone 屏幕分辨率的大小。你的控件框架比屏幕大就没有意义了。
--------------------------------------------
|         |                      |         |
|         |                      |         |
|         |                      |         |
|         |                      |         |
|         |                      |<------------------ iPhone Screen frame
|         |                      |         |
|         |                      |         |
|         |                      |         |
|         |                      |         |<------- ScrollView Content size
|         |                      |         |
|         |                      |         |
|         |                      |<----------------- ScrollView Frame Size
|         |                      |         |
|         |                      |         |      
|         |                      |         |
|         |                      |         |
|         |                      |         |
|         ------------------------         |
|                                          |
|                                          |
|                                          |
--------------------------------------------

我希望这个表述能让事情应该如何运作更清晰。换句话说,滚动框架是您可以看到内容的洞,如果整个大小与内容一样大,则无需滚动,因为您可以看到所有内容。
我建议还尝试使用代码编写组件,而不使用IB,以获得更好的理解。

谢谢,这也说得通。我认为你关于困在框架和内容尺寸差异上的想法是正确的。在运行时进行调整大小也是有道理的,我会尝试一下! - steve8918

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