Используете UITableViewController с небольшой таблицей?

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

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

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

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

Спасибо!

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
15
0
15 948
11

Ответы 11

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

согласен, просто расширите UIViewController и добавьте свойство tableView самостоятельно, как это <code> @property (неатомарно, сохранить) UITableView * tableView; </code>

Zennichimaro 28.03.2013 06:39

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

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

Уточните, как именно вы этого добиваетесь?

rpj 22.10.2008 02:51

Просто используйте обычный UIViewController и, например, программно создайте TableView - UITableView * mTableView = [[UITableView alloc] initWithFrame: CGRectMake (0,0,320,400)]; mTableView.delegate = self; [[собственный просмотр] addSubview: mTableView]; и вот оно что! :)

Guntis Treulands 17.07.2012 17:30

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

Мне нужен контроллер представления, чтобы иметь возможность нажимать на UINavigationController, поэтому он там. Таким образом, у меня создалось впечатление, что нет необходимости добавлять табличное представление к родительскому представлению, потому что контроллер представления заботится об этом через прокси. Я что-то упускаю?

rpj 21.10.2008 23:26

Вы назначаете выход представления MyUIViewControllerSubclass своей таблице или ее охватывающему представлению?

Ben Gottlieb 21.10.2008 23:35

Как показано в коде, который я опубликовал в качестве «ответа», я определенно назначаю выход «view» только что созданной таблице.

rpj 22.10.2008 02:50

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

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

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

Невероятный! Я почти даже не пробовал это сделать, но это была ЕДИНСТВЕННАЯ вещь, с которой я мог работать, пытаясь изменить размер табличного представления UITableViewController. Все, что я сделал, это установил рамку табличного представления в viewDidAppear, и он отлично работает. Спасибо!

user3344977 14.08.2014 02:18

У меня была такая же проблема, и я решил ее:

-(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];

Allisone 22.08.2010 17:50

Лучшим решением, вероятно, было бы вместо этого изменить свойство табличного представления autoresizingMask - изменить его ширину, но не высоту.

aopsfan 29.12.2011 18:34

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

    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];
}

Другие вопросы по теме