Использование UITableViewController с таблицей небольшого размера?

При использовании UITableViewController, метод initWithStyle: автоматически создает базовый UITableView с - согласно документации - "правильные размеры".

Моя проблема в том, что эти "правильные размеры" кажутся 320x460 (размер экрана iPhone), но я подталкиваю эту пару TableView/Controller в UINavigationController, который сам содержится в UIView, который сам составляет примерно половину высоты экрана.

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

Итак, мой вопрос сводится к следующему: что такое правильный способ сообщить UITableViewController изменить его компонент UITableView на указанный прямоугольник?

Спасибо!

Обновление. Я пробовал все предлагаемые здесь методы безрезультатно, но я нашел одну интересную вещь: если я вообще избегу UINavigationController (чего я еще не хочу делать для производства, но в качестве эксперимента) и добавьте представление таблицы в качестве прямого подсмотра рассматриваемого мною представления, при этом учитывается размер кадра. Самый сильный момент . Я повторно вношу UINavigationController в микс, независимо от того, добавлен ли он в виде подвью до или после представления таблицы, и независимо от того, будет ли alloc/init до или после представления таблицы добавляется как подвью, результат такой же, как и раньше.

Я начинаю подозревать, что UINavigationController - это не просто командный игрок...

Обновление 2. Предложение по проверке размера кадра после просмотра таблицы на экране было хорошим: оказывается, что навигационный контроллер фактически изменяет его время между загрузкой и отображением. Мое решение, в лучшем случае взломанное, заключалось в том, чтобы кэшировать фрейм, указанный при загрузке, и reset, если он изменился в начале таблицыView: cellForRowAtIndexPath:. Почему вы спрашиваете? Потому что это одно место, которое я нашел, что сработало, вот почему!

Я не рассматриваю это решение как явно неправильное, но, для того, чтобы кто-либо еще читал, он работает.

Ответы

Ответ 1

Почему бы просто не использовать обычный UIViewController и создать таблицу вручную?

Ответ 2

У меня была та же проблема, и я решил ее с помощью:

-(void) loadView {
    [self setView:[[[UIView alloc] initWithFrame:CGRectZero] autorelease]];
    [[self view] setAutoresizesSubviews:NO];

    /* Create & configure table and other views... */

    [self setResultsTable:[[RadarTableViewController alloc] initWithNibName:nil bundle:nil]];
    [[resultsTable view] setFrame:CGRectMake(0,45,320,200)];
}

Это выполняется в родительском (просто в UIViewController в моем случае) контроллере.

Ответ 3

У меня была та же проблема, и я решил ее, изменив размер tableView в функции viewDidAppear UITableViewController. Не идеальное решение, но оно работает.

Ответ 4

Вы можете установить верхнее поле, используя:

    UIEdgeInsets inset = UIEdgeInsetsMake(50, 0, 0, 0);
    self.tableView.contentInset = inset;

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

Не следует использовать UITableViewController, просто используйте UIViewController и программно создайте UITableview

Ответ 5

Я согласен с ответом Бен. Я часто сталкиваюсь с ситуацией, когда мне нужно изменить размер UITableVIew из-за других элементов управления в представлении.

У меня обычно есть обычный UIViewController с UITableView IBOutlet. Тогда, если мне нужно, я могу просто манипулировать рамкой объекта UITableView, чтобы получить его до необходимого размера.

Ответ 6

Я не уверен, почему вы создаете дополнительный контроллер представления для своей таблицы. Однако в вашем коде я не вижу, чтобы вы добавляли представление таблицы к его родительскому элементу. Вы также можете попытаться уменьшить высоту границ, пока все это не появится на экране; как только вы это сделаете, это может дать вам представление о том, почему он не работает так, как вы ожидаете.

Ответ 7

Проверьте свойства autoresizingMask и contentMode UITableView. Они могут влиять на кадр.

Ответ 8

i исправил эту проблему с помощью этого кода

{
    UIEdgeInsets insets;
    insets.left = 0;
    insets.right = 0;
    insets.top = 0;
    insets.bottom = 60;
    self.tableView.contentInset = insets;
    [self.tableView setScrollIndicatorInsets:insets];
}

Ответ 9

Если вы используете Interface Builder, вы можете просто перейти в окно свойств "Table View Size" и изменить "Вниз" для обоих Content и Scroller с высотой другого виджета.

Ответ 10

Try:

self.edgesForExtendedLayout = UIRectEdgeNone;

//This one in case your NavigationController is not Translucent
self.extendedLayoutIncludesOpaqueBars = NO; 

Надеюсь, что это поможет.

Ответ 11

Установите фрейм в UINavigationController.