Как изменить размер UITableView в UITableViewController с заголовком раздела

у меня есть сгруппированный UITableView в UITableViewController, и я хочу изменить его размер по горизонтали.

Я пробовал много разных способов, но ни один из них не был идеальным.

что я пробовал:

1.) Переопределение - [UITableView setFrame:], но он не перемещал заголовки разделов, и с обеих сторон есть черные области (потому что за табличным представлением ничего нет).

2.) Переопределение - [UITableViewCell setFrame:], но он по-прежнему не перемещать заголовки (что важный.)

3.) Вызов - [self.view setFrame:] от UITableViewController, но он ничего не делает.

Если у вас есть идея, как ее решить, пожалуйста, поделитесь ею со мной!

5 ответов


если вы называете - [UITableView setFrame:] С - [UITableViewController viewDidAppear:], работает:

- (void)viewDidAppear:(BOOL)animated
{
    [self.tableView setFrame:CGRectMake(x, y, w, h)];
}

чтобы избежать наличия черных полос на каждой стороне представления таблицы, установите цвет фона главного окна приложения на белый:

[[[UIApplication sharedApplication] keyWindow] setBackgroundColor:[UIColor whiteColor]];

основная проблема заключается в том, что представление таблицы UITableViewController является основным видом, поэтому он не предназначен для изменения размера.

лучший вариант-не использовать UITableViewController. Вместо этого используйте UIViewController и добавить свой собственный UITableView в качестве подвида основного вида контроллера вида. Таким образом, вы можете размер по мере необходимости.

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


чтобы исправить изменяемые заголовки, я бы попытался:

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    CGFloat headerHeight = 40;
    UIView *headerView = [[UIView alloc] initWithFrame: CGRectMake(0, 0, self.view.frame.size.width, headerHeight)];
    UILabel *cellLabel = [[UILabel alloc] initWithFrame: headerView.frame];
    [cellLabel setText: @"My Text"];
    [cellLabel setBackgroundColor: [UIColor clearColor]];
    [headerView addSubview: cellLabel];
    return headerView;
}

    - (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return 40;
}

этот код должен заменить этот метод:

- (NSString *) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section

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


немного поздно на вечеринку, но это всегда может пригодиться для других, ищущих тему...

Я не думаю, что делать это в viewDid, это правильный способ сделать это, так как он определенно будет виден пользователю и изменять размер перед их глазами. Не делает для большого пользовательского опыта imo.

в swift 4 я использую что-то вроде

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    var rect = tableView.frame
    if rect.size.height != h && rect.size.width != w { 
        // set x and y to any value you need. you can also have a 
        // condition about the origin (x,y) 
        // if you have a gap on the left or top...
        rect.size.height = h;
        rect.size.width = w;
        tableView.frame = rect
    }
}

это внесет изменения до того, как tableView будет виден и сделает пользовательский интерфейс таким большим лучше, а также, как указано в принятом ответе, вам нужно будет установить цвет окна цвет вашего представления таблицы, чтобы смешаться лучше (белый по умолчанию)

    UIApplication.shared.keyWindow?.backgroundColor = .white