views:

33

answers:

1

Hello. I'm trying to create a view that's full of controls (buttons, text views, labels, etc.) that can scroll, since I don't have enough screen space for all the controls. I understand that I need the root view in my application to be a UIScrollView and I need to attach to that a UIView with all my controls in it. The problem is, after I set the root view to be a UIScrollView, and I add a UIView to the root view, Interface Builder won't let me position any of my controls, it just drops them all in the center.

  1. Am I correctly understanding how I make a view scroll?
  2. If so, how can I get Interface Builder to allow me to position my controls?
  3. Once I'm able to do this, how can I position controls in Interface Builder beyond the dimensions of the window, since it's going to be scrollable?

Thanks so much in advance for your help!

+1  A: 

In my experience, you're better off having a UIView as a root view and then a UIScrollView as the one and only, screen-filling subview of that view. Saves some trouble in code (ugly casts) and when extending (how to put some screen-fixed element in there afterwards?)

If you want to keep it in IB, either

  • add your own custom view to the library (sorry, no experience with that), or
  • just put the big UIView in the scrollview and position the elements by their x/y position, or
  • set your root-views status-bar to unspecified so you can resize the root view to whatever size you need to layout the contents of the scrollview correctly, and when done, wrap it up again to 320x480 (but make sure you disable autosizing on the right elements, or the resize action will destroy your work), or
  • design the UIView separately and drag&drop it into place as a subview of the scrollview, in the document-window! use cmd-0, that window! the parent will light up before you drop something into it. The set the top-left x,y of the dropped subview to 0,0. (this method requires you to link up all outlets everytime you drag&drop)

If you choose to take the non-IB route, design your UIView and save it as a nib, and then load the nib programmatically when the rootcontroller loads. (there's a lot on that topic on SO) When you've got this right, it will be the friendliest way from the design/IB perspective.

So.. a lot of options, none of them really good. IB can do wonders but you need some time to understand it. (I'm still struggling... so suggestions are welcome)


For clarity, my typical view-scrollview-view-elements layout looks, with fake numbers, like:

View (320x480-ish)
    Scroll View (320x480-ish)
        View (1024x1024)
            Label (positioned 0,0)
            Button (positioned 500,900)
            ImageView (1024x800, positioned 0,100)
    UISearchBar (possibly, always on screen, above scrollview or sliding in, ...)
mvds
I still have the same problem, even with the layout you posted. In IB, if I have a UIView as the root view, then I add to it a UIScrollView as a subview, then I add to that another UIView, then I add to that all my controls as subviews, IB won't let me position them. It just sticks them in the middle and I can't move them.
BeachRunnerJoe
hmm, can't reproduce what you're saying here. I do know that the top view under a VC will be positioned in the center, immutable. Other than that I have not the slightest clue. If you could share the xib displaying this I'll have a look.
mvds