При использовании UITableViewController метод initWithStyle: автоматически создает базовый UITableView с - согласно документации - «правильными размерами».
Моя проблема в том, что эти «правильные размеры» кажутся 320x460 (размер экрана iPhone), но я вставляю эту пару TableView / Controller в UINavigationController, который сам содержится в UIView, который сам составляет примерно половину высоты экрана.
Никакие споры о фреймах или границах, которые я могу придумать, похоже, правильно сбрасывают размер таблицы, и поэтому она «слишком длинная», что означает, что существует набор строк, которые отодвинуты от нижней части экрана и не видны и недоступны для прокрутка.
Итак, мой вопрос сводится к следующему: как правильно сообщить UITableViewController об изменении размера его компонента UITableView до указанного прямоугольника?
Спасибо!
Обновлять Я пробовал все методы, предложенные здесь, безрезультатно, но нашел одну интересную вещь: если я вообще откажусь от UINavigationController (что я пока не хочу делать для производства, а в качестве эксперимента), и добавлю табличное представление как подвид непосредственный охватывающего представления, о котором я упоминал, размер кадра задан как уважается. в самый момент Я повторно ввожу UINavigationController в микс, независимо от того, добавлен ли он как подпредставление до или после табличного представления, и независимо от того, был ли выделен / инициализирован его до или после того, как табличное представление добавлено как подпредставление, результат такой же, как и раньше.
Я начинаю подозревать, что UINavigationController не очень хороший командный игрок ...
Обновление 2 Предложение проверить размер кадра после представления таблицы на экране было удачным: оказалось, что контроллер навигации фактически изменяет его размер через некоторое время между загрузкой и отображением. Мое решение, в лучшем случае хакерское, заключалось в том, чтобы кэшировать кадр, заданный при загрузке, и сбрасывать его, если он был изменен в начале tableView: cellForRowAtIndexPath :. Почему там спросите вы? Потому что это единственное место, которое работает, вот почему!
Я не считаю это решением, поскольку оно явно неприемлемо, но для всех, кто читает, похоже, оно работает.





Почему бы просто не использовать обычный UIViewController и не создать таблицу вручную?
Я согласен с ответом Бена. Я часто сталкивался с ситуацией, когда мне нужно изменить размер UITableVIew из-за других элементов управления в представлении.
Обычно у меня есть обычный UIViewController с UITableView IBOutlet. Затем, если мне нужно, я могу просто манипулировать фреймом объекта UITableView, чтобы довести его до нужного мне размера.
Уточните, как именно вы этого добиваетесь?
Просто используйте обычный UIViewController и, например, программно создайте TableView - UITableView * mTableView = [[UITableView alloc] initWithFrame: CGRectMake (0,0,320,400)]; mTableView.delegate = self; [[собственный просмотр] addSubview: mTableView]; и вот оно что! :)
Я не уверен, зачем вы создаете дополнительный контроллер представления для своей таблицы. Однако в вашем коде я не вижу, чтобы вы добавляли табличное представление к его родительскому элементу. Вы также можете попробовать уменьшить высоту границ, пока все не появится на экране; как только вы это сделаете, это может дать вам представление о том, почему это не работает так, как вы ожидаете.
Мне нужен контроллер представления, чтобы иметь возможность нажимать на UINavigationController, поэтому он там. Таким образом, у меня создалось впечатление, что нет необходимости добавлять табличное представление к родительскому представлению, потому что контроллер представления заботится об этом через прокси. Я что-то упускаю?
Вы назначаете выход представления MyUIViewControllerSubclass своей таблице или ее охватывающему представлению?
Как показано в коде, который я опубликовал в качестве «ответа», я определенно назначаю выход «view» только что созданной таблице.
Проверьте свойства autoresizingMask и contentMode UITableView. Оба они могут повлиять на кадр.
Если вы используете Interface Builder, вы можете просто перейти в окно свойств «Table View Size» и изменить Bottom Insets для Content и Scroller с высотой другого виджета.
У меня была такая же проблема, и я решил ее, изменив размер tableView в функции viewDidAppear UITableViewController. Не идеальное решение, но оно работает.
Невероятный! Я почти даже не пробовал это сделать, но это была ЕДИНСТВЕННАЯ вещь, с которой я мог работать, пытаясь изменить размер табличного представления UITableViewController. Все, что я сделал, это установил рамку табличного представления в viewDidAppear, и он отлично работает. Спасибо!
У меня была такая же проблема, и я решил ее:
-(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 на 181 пиксель внутри UIViewController всегда сжимался, теперь он слушает настройки фрейма, так как я использую ваш [[self view] setAutoresizesSubviews: NO];
Лучшим решением, вероятно, было бы вместо этого изменить свойство табличного представления autoresizingMask - изменить его ширину, но не высоту.
Вы можете установить верхнее поле, используя:
UIEdgeInsets inset = UIEdgeInsetsMake(50, 0, 0, 0);
self.tableView.contentInset = inset;
Это не очень хорошая практика, на всякий случай, если вам нужно больше места наверху, вы можете его использовать.
Не следует использовать UITableViewController, просто используйте UIViewController и программно создайте UITableview
Установите рамку в UINavigationController.
Пытаться:
self.edgesForExtendedLayout = UIRectEdgeNone;
//This one in case your NavigationController is not Translucent
self.extendedLayoutIncludesOpaqueBars = NO;
Надеюсь это поможет.
я исправил эту проблему с помощью этого кода
{
UIEdgeInsets insets;
insets.left = 0;
insets.right = 0;
insets.top = 0;
insets.bottom = 60;
self.tableView.contentInset = insets;
[self.tableView setScrollIndicatorInsets:insets];
}
согласен, просто расширите UIViewController и добавьте свойство tableView самостоятельно, как это <code> @property (неатомарно, сохранить) UITableView * tableView; </code>