Вопрос

У меня довольно сложная форма, выложенная в UITableView.Эта форма имеет некоторые UICollectionView внутри ячейки табличного представления, а также некоторые средства выбора, которые отображаются так же, как и в приложении «Календарь»:

Image

Теперь, когда я делаю это в своем приложении, один из UICollectionView Я стал выше, чем начал, и продолжает продолжаться (я добавил красную рамку, чтобы убедиться, что это UICollectionView размер которого изменялся):

Image

Я попробовал отладить UICollectionView просматриваю свойство, но оно никогда не меняется (и его метод получения/установки не вызывается больше, чем я ожидал) - даже несмотря на то, что когда я его печатаю cellForRowAtIndexPath он отображается в измененном размере.Есть ли способ лучше отладить это, или кто-то был в такой же ситуации?

Спасибо!

Код:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//self.campos is a dictionary with sections and rows stored
    NSMutableArray *infoCampos = [[self.campos objectAtIndex:indexPath.section] objectForKey:@"campos"];
NSDictionary *infoCampo = [infoCampos objectAtIndex:indexPath.row];

if ([[infoCampo objectForKey:@"nome"] isEqualToString:@"dosePorComprimido"]) {
    //Remove picker cell if finds it
    for (infoCampo in infoCampos) {
        if ([infoCampo objectForKey:@"view"] == self.dosagemMedicamento.view) {
            [infoCampos removeObject:infoCampo];
            [tableView reloadSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationAutomatic];
            [tableView deselectRowAtIndexPath:indexPath animated:YES];
            return;
        }
    }

    //Insert new cell
    infoCampo = [infoCampos objectAtIndex:indexPath.row];
    [infoCampos addObject:@{@"tipo":@5, @"view":self.dosagemMedicamento.view, @"nome":[infoCampo objectForKey:@"nome"]}];
    [tableView reloadSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationAutomatic];
    [self.dosagemMedicamento.view.superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[pickerDosagem]|" options:0 metrics:nil views:@{@"pickerDosagem":self.dosagemMedicamento.view}]];
}
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSDictionary *infoCampo = [[[self.campos objectAtIndex:indexPath.section] objectForKey:@"campos"] objectAtIndex:indexPath.row];
    UIView *view;

    if ([infoCampo objectForKey:@"view"]) {
        view = (UIView *) [infoCampo objectForKey:@"view"];
        return view.frame.size.height;
    }

    return 44.0f;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:

(NSIndexPath *)indexPath
{
    UITableViewCell *cell;
    NSMutableDictionary *infoCampo = [[[self.campos objectAtIndex:indexPath.section] objectForKey:@"campos"] objectAtIndex:indexPath.row];
    UIView *view;

cell = [tableView dequeueReusableCellWithIdentifier:[[infoCampo objectForKey:@"nome"] stringByAppendingString:@"ViewLinhaCellView"] forIndexPath:indexPath];

        view = [cell viewWithTag:1];

        [view addSubview:[infoCampo objectForKey:@"view"]];

return cell;
}

РЕДАКТИРОВАТЬ: забыл упомянуть, что я не обновляю представление таблицы с помощью reloadData, а только необходимые разделы/строки с помощью reloadRowsAtIndexPaths и reloadSections.Это делает ситуацию еще более странной, потому что я не перезагружаю этот конкретный раздел.

РЕДАКТИРОВАТЬ 2: добавлен источник данных и код делегата

Это было полезно?

Решение

Я считаю, что ваша проблема здесь, в реализации tableView:heightForRowAtIndexPath:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSDictionary *infoCampo = [[[self.campos objectAtIndex:indexPath.section] objectForKey:@"campos"] objectAtIndex:indexPath.row];
    UIView *view;

    if ([infoCampo objectForKey:@"view"]) {
        view = (UIView *) [infoCampo objectForKey:@"view"];
        return view.frame.size.height;
    }

    return 44.0f;
}

Размер представления, вероятно, изменяется с помощью автоматического макета или маски автоматического изменения размера.Здесь недостаточно информации, чтобы точно сказать, почему, но табличные представления и автоматическая компоновка могут вести себя забавно.Я рекомендую просто возвращать установленную вами высоту, а не получать высоту из представления:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSDictionary *infoCampo = [[[self.campos objectAtIndex:indexPath.section] objectForKey:@"campos"] objectAtIndex:indexPath.row];
    UIView *view;

    if ([infoCampo objectForKey:@"view"]) {
        if ([infoCampo objectForKey:@"viewHeight"]) {
            return [[infoCampo objectForKey:@"viewHeight"] floatValue];
        } else {
            return 216.0f;
        }
    }

    return 44.0f;
}

А viewHeight Ключ позволяет указать произвольную высоту для представления каждой ячейки, но эта реализация также возвращает высоту по умолчанию (216), которая является стандартной высотой для представлений выбора.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top