У меня есть небольшая форма, которую я построил в основном в конструкторе интерфейсов:

Когда пользователь касается одного из текстовых полей, я делаю верхнюю часть экрана прокручиваемой (обратите внимание, что при отсутствии клавиатуры прокрутка не требуется, и ни одно из полей не скрыто за клавиатурой).

Я добился этого с помощью очень небольшого кода. Все элементы управления моей формы находятся внутри UIScrollView, который отключен и имеет размер 0x0 (по умолчанию) при загрузке. Когда я обнаруживаю присутствие клавиатуры, я включаю ее и изменяю ее размеры до ширины видов и высоты вида + размер клавиатуры . Затем я отключаю и изменяю размер прокрутки при удалении клавиатуры (я установил обратно 0x0).
Это работает почти идеально. За одним исключением (пока):
Область прокрутки (точнее, вид внутри нее) слишком высокая. Поскольку форма без клавиатуры не занимает весь экран, я нахожу, что могу прокрутить до конца моего вида (один полноэкранный режим) + высоту клавиатуры, когда я действительно хочу прокрутить до содержимого представления. + высота клавиатуры.
Я подумал, что мог бы просто сделать представление короче, чтобы оно соответствовало размеру содержимого, но конструктор интерфейса (xcode 4.2), похоже, заставляет его занимать весь экран. Попытка сделать это в коде также не работает, потому что, по-видимому, self.view.frame.size не может быть назначен. Как мне достичь того, что я ищу? В частности, когда клавиатура присутствует, я хочу, чтобы прокручиваемая область в верхней половине экрана имела такой размер, чтобы внизу не было так много провисания:
