Iphone 使用Interface Builder创建UIScrollView的步骤

Iphone 使用Interface Builder创建UIScrollView的步骤,iphone,ios,uiview,uiscrollview,Iphone,Ios,Uiview,Uiscrollview,我正在尝试使用UIScrollView,似乎有一些基本的东西我只是不理解 假设我想在iphone应用程序中使用UIScrollView。我有一个充满按钮的视图,它是320x700。显然,这对于320x480的iPhone来说太大了。所以我知道我必须使用UIScrollView。但是,这是我创建对象的顺序吗 创建一个320x700的UIScrollView作为“视图”中的尺寸 将所有我的按钮等放置在此滚动视图上 在viewDidLoad中,将contentSize设置为320x700 将UIScr

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

假设我想在iphone应用程序中使用UIScrollView。我有一个充满按钮的视图,它是320x700。显然,这对于320x480的iPhone来说太大了。所以我知道我必须使用UIScrollView。但是,这是我创建对象的顺序吗

  • 创建一个320x700的UIScrollView作为“视图”中的尺寸
  • 将所有我的按钮等放置在此滚动视图上
  • 在viewDidLoad中,将contentSize设置为320x700
  • 将UIScrollView的委托设置为文件所有者,将文件所有者的视图设置为UIScrollView
  • 将视图大小重置回320x480
  • 是这样吗

    这是可行的,但对我来说没有意义。我知道视图应该是画布,在这里我添加了所有的UI元素。我希望iPhone应用程序的“画布”是320x700,并且我希望能够在这个320x700画布上放置我的按钮等。但如果我不将UIScrollView的大小更改回320x480,它将不会滚动,因为我需要将UIScrollView的内容大小设置为大于其大小

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


    还有其他更合理的方法吗?在我对如何工作的理解中,我遗漏了什么?

    你是对的,视图是添加所有UI元素的画布。 界面生成器一开始有点奇怪,但你会习惯的,这就是它的工作方式

    您必须调整ScrollView的大小,这让您陷入了困境。你应该这样想: ScrollView有一个框架大小和一个内容大小。它的构建方式是,如果内容大小大于帧大小,那么它将滚动。您必须在interface builder中使框架尽可能大,以便可以定位进入其中的元素。运行应用程序时,应调整滚动框的大小,使其适合iPhone的屏幕分辨率。控件的边框比屏幕大是没有意义的

    --------------------------------------------
    |         |                      |         |
    |         |                      |         |
    |         |                      |         |
    |         |                      |         |
    |         |                      |<------------------ iPhone Screen frame
    |         |                      |         |
    |         |                      |         |
    |         |                      |         |
    |         |                      |         |<------- ScrollView Content size
    |         |                      |         |
    |         |                      |         |
    |         |                      |<----------------- ScrollView Frame Size
    |         |                      |         |
    |         |                      |         |      
    |         |                      |         |
    |         |                      |         |
    |         |                      |         |
    |         ------------------------         |
    |                                          |
    |                                          |
    |                                          |
    --------------------------------------------
    
    --------------------------------------------
    |         |                      |         |
    |         |                      |         |
    |         |                      |         |
    |         |                      |         |
    || |更新
    我已经发布了我认为更简单更好的

    起初的 下面是另一种您可能更喜欢的方法:

  • 将文件的所有者占位符的自定义类设置为视图控制器子类
  • 在nib中将
    UIScrollView
    创建为顶级对象。将其大小设置为屏幕大小(320x460),或者只打开“模拟度量”下的状态栏
  • 将滚动视图的
    委托
    出口连接到文件的所有者
  • 将文件所有者的
    视图
    出口设置为滚动视图
  • 在nib中创建一个
    ui视图
    作为另一个顶级对象。这将是您的内容视图
  • 将内容视图的大小设置为320x700
  • 在视图控制器(文件的所有者)中创建名为
    contentView
    的强(或保留,如果不使用ARC)插座,并将其连接到内容视图
  • 将按钮放在内容视图中
  • 在视图控制器的
    viewDidLoad
    中,执行以下操作:

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

    - (void)viewDidLoad {
        [super viewDidLoad];
        [self.view addSubview:self.contentView];
        ((UIScrollView *)self.view).contentSize = self.contentView.frame.size;
    }
    
    - (void)viewDidUnload {
        self.contentView = nil;
        [super viewDidUnload];
    }
    


  • 谢谢!这对我来说更有意义。。。在运行时对视图进行“缝合”,以便内容视图的构建不会受到Interface Builder的干扰。一个问题,为什么要将滚动视图大小设置为460?是否满足滚动视图必须小于480的要求?状态栏需要20个点。大小其实并不重要,因为
    UIViewController
    无论如何都应该将其调整为全屏。对于scrollview,Interface builder已经浪费了我好几个小时的时间。如果我自己用代码来构建它,速度会更快。大多数时候这都是我的错,但在这种情况下,IB在把所有东西都扔到导航栏的高度时会遇到一些问题。我相信我做得对。我喜欢用代码缝合东西。为什么有必要在ViewDiUnload中将contentView设置为nil?如果您的
    contentView
    outlet很强,它会将视图保留在内存中,除非您将其设置为nil。谢谢,这也很有意义。我认为你说得对,你被框架和内容大小之间的差异所困扰。在运行时调整大小也是有意义的,我将尝试一下!