Ответ 1
Почему бы просто не использовать обычный UIViewController и создать таблицу вручную?
При использовании UITableViewController, метод initWithStyle: автоматически создает базовый UITableView с - согласно документации - "правильные размеры".
Моя проблема в том, что эти "правильные размеры" кажутся 320x460 (размер экрана iPhone), но я подталкиваю эту пару TableView/Controller в UINavigationController, который сам содержится в UIView, который сам составляет примерно половину высоты экрана.
Никаких фреймов или ограничений, которые я могу придумать, по-видимому, правильно reset размер таблицы, и как таковой он "слишком длинный", то есть есть набор строк, которые выталкиваются из нижней части экрана и невидимым и недоступным с помощью прокрутки.
Итак, мой вопрос сводится к следующему: что такое правильный способ сообщить UITableViewController изменить его компонент UITableView на указанный прямоугольник?
Спасибо!
Обновление. Я пробовал все предлагаемые здесь методы безрезультатно, но я нашел одну интересную вещь: если я вообще избегу UINavigationController (чего я еще не хочу делать для производства, но в качестве эксперимента) и добавьте представление таблицы в качестве прямого подсмотра рассматриваемого мною представления, при этом учитывается размер кадра. Самый сильный момент . Я повторно вношу UINavigationController в микс, независимо от того, добавлен ли он в виде подвью до или после представления таблицы, и независимо от того, будет ли alloc/init до или после представления таблицы добавляется как подвью, результат такой же, как и раньше.
Я начинаю подозревать, что UINavigationController - это не просто командный игрок...
Обновление 2. Предложение по проверке размера кадра после просмотра таблицы на экране было хорошим: оказывается, что навигационный контроллер фактически изменяет его время между загрузкой и отображением. Мое решение, в лучшем случае взломанное, заключалось в том, чтобы кэшировать фрейм, указанный при загрузке, и reset, если он изменился в начале таблицыView: cellForRowAtIndexPath:. Почему вы спрашиваете? Потому что это одно место, которое я нашел, что сработало, вот почему!
Я не рассматриваю это решение как явно неправильное, но, для того, чтобы кто-либо еще читал, он работает.
Почему бы просто не использовать обычный UIViewController и создать таблицу вручную?
У меня была та же проблема, и я решил ее с помощью:
-(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 в моем случае) контроллере.
У меня была та же проблема, и я решил ее, изменив размер tableView в функции viewDidAppear UITableViewController. Не идеальное решение, но оно работает.
Вы можете установить верхнее поле, используя:
UIEdgeInsets inset = UIEdgeInsetsMake(50, 0, 0, 0);
self.tableView.contentInset = inset;
Это не хорошая практика, на всякий случай, если вы хотите больше места сверху, вы можете ее использовать.
Не следует использовать UITableViewController, просто используйте UIViewController и программно создайте UITableview
Я согласен с ответом Бен. Я часто сталкиваюсь с ситуацией, когда мне нужно изменить размер UITableVIew из-за других элементов управления в представлении.
У меня обычно есть обычный UIViewController с UITableView IBOutlet. Тогда, если мне нужно, я могу просто манипулировать рамкой объекта UITableView, чтобы получить его до необходимого размера.
Я не уверен, почему вы создаете дополнительный контроллер представления для своей таблицы. Однако в вашем коде я не вижу, чтобы вы добавляли представление таблицы к его родительскому элементу. Вы также можете попытаться уменьшить высоту границ, пока все это не появится на экране; как только вы это сделаете, это может дать вам представление о том, почему он не работает так, как вы ожидаете.
Проверьте свойства autoresizingMask и contentMode UITableView. Они могут влиять на кадр.
i исправил эту проблему с помощью этого кода
{
UIEdgeInsets insets;
insets.left = 0;
insets.right = 0;
insets.top = 0;
insets.bottom = 60;
self.tableView.contentInset = insets;
[self.tableView setScrollIndicatorInsets:insets];
}
Если вы используете Interface Builder, вы можете просто перейти в окно свойств "Table View Size" и изменить "Вниз" для обоих Content и Scroller с высотой другого виджета.
Try:
self.edgesForExtendedLayout = UIRectEdgeNone;
//This one in case your NavigationController is not Translucent
self.extendedLayoutIncludesOpaqueBars = NO;
Надеюсь, что это поможет.
Установите фрейм в UINavigationController
.