Шаги для создания UIScrollView с помощью Interface Builder

Я пытаюсь использовать UIScrollView, и, как представляется, есть некоторые фундаментальные вещи, которые я просто не понимаю.

Скажем, я хочу использовать UIScrollView в моем приложении iphone. У меня есть вид, заполненный кнопками размером 320x700. Очевидно, что это слишком большой размер для iPhone 320x480. Поэтому я знаю, что мне нужно использовать UIScrollView. Тем не менее, это порядок, которым я должен создавать объекты

  • Создайте UIScrollView размером 320x700 в качестве размеров в "View"
  • Поместите все мои кнопки и т.д. в это представление прокрутки
  • В viewDidLoad установите contentSize для 320x700
  • Установите делегат UIScrollView файловому владельцу и представление FileOwner в UIScrollView
  • Reset размер представления назад до 320x480.

Правильно ли это?

Это работает, но для меня это не имеет смысла. Я понимаю, что представление должно быть холстом, где я добавляю все элементы пользовательского интерфейса. Я хочу, чтобы "холст" приложения для iPhone был 320x700, и я хочу, чтобы мои кнопки и т.д. Отображались на этом холсте 320x700. Но если я не изменю размер UIScrollView до 320x480, он не будет прокручиваться, потому что мне нужно установить размер содержимого UIScrollView больше его размера.

Но если я установил размер UIScrollView на 320x480, тогда я не вижу экран и кнопки между 480 и 700 в Interface Builder! Поэтому мне кажется, что я должен сделать все свои изменения и добавить все элементы пользовательского интерфейса в UIScrollView, а затем установить его обратно на 320x480!

Есть ли другой способ сделать это, что имеет больше смысла? Что мне не хватает в моем понимании того, как это должно работать?

Ответ 1

UPDATE

Я разместил другое решение здесь, которое, я думаю, проще и лучше.

ORIGINAL

Вот еще один способ сделать это, чтобы вам было лучше:

  • Задайте пользовательский класс заполнителя владельца файла для вашего подкласса контроллера вида.
  • Создайте UIScrollView как объект верхнего уровня в своем nib. Установите его размер на размер экрана (320x460) или просто включите строку состояния в разделе "Имитированные показатели".
  • Подключите просмотр прокрутки delegate к файловому владельцу.
  • Установите в папку прокрутки файл view.
  • Создайте UIView как другой объект верхнего уровня в своем nib. Это будет ваш просмотр содержимого.
  • Задайте размер представления контента 320x700.
  • Создайте сильную (или сохраните, если не используете ARC) розетку с именем contentView в вашем контроллере представления (владелец файла) и подключите его к просмотру содержимого.
  • Поместите свои кнопки в представление содержимого.
  • В вашем контроллере 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];
    }
    

scrollbuttons project window
Полный размер

Ответ 2

Вы правы, представление - это холст, в который вы добавляете все элементы пользовательского интерфейса. Сначала построитель интерфейса немного странный, но вы привыкнете к нему, так оно и есть.

Вы застряли в том, что вам нужно изменить размер ScrollView. Вы должны думать об этом так: ScrollView имеет размер кадра и размер содержимого. Способ, который он построил, состоит в том, что если размер содержимого больше размера кадра, он будет прокручиваться. Вы должны сделать рамку такой большой, как вам нужно, в построителе интерфейса, чтобы вы могли позиционировать элементы, которые входят внутрь. При запуске приложения вы должны изменить размер рамки прокрутки, чтобы она соответствовала разрешению экрана iPhone. Для ваших элементов управления не имеет смысла иметь рамку, большую, чем экран.

--------------------------------------------
|         |                      |         |
|         |                      |         |
|         |                      |         |
|         |                      |         |
|         |                      |<------------------ iPhone Screen frame
|         |                      |         |
|         |                      |         |
|         |                      |         |
|         |                      |         |<------- ScrollView Content size
|         |                      |         |
|         |                      |         |
|         |                      |<----------------- ScrollView Frame Size
|         |                      |         |
|         |                      |         |      
|         |                      |         |
|         |                      |         |
|         |                      |         |
|         ------------------------         |
|                                          |
|                                          |
|                                          |
--------------------------------------------

Надеюсь, что это представление станет более ясным, как должны работать вещи. Чтобы выразить это каким-то другим способом, кадр прокрутки - это отверстие, в котором вы можете видеть контент, если все такое же большое, как и контент, который у вас есть нет необходимости прокручивать, потому что вы можете видеть все это.

Я бы предложил также попытаться написать компоненты в коде без использования IB, чтобы лучше понять.