Содержимое UitableviewCell iOS 7.1 частично совпадает с приведенным ниже

Итак, у меня есть код, который успешно работает на iOS 7.0, но не на 7.1. У меня простая таблица с кодом:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 10;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 70.0;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    for (UIView *view in cell.contentView.subviews) {
        [view removeFromSuperview];
    }

    UILabel *label = [[UILabel alloc] init];
    label.text = [NSString string];

    for (NSInteger i = 0; i < 20; i++) {
        label.text = [label.text stringByAppendingString:@"label String "];
    }

    label.translatesAutoresizingMaskIntoConstraints = NO;
    label.numberOfLines = 0;
    label.lineBreakMode = NSLineBreakByWorldWrapping;
    //label.lineBreakMode = NSLineBreakByTruncatingTail; //I have tried this too
    [cell.contentView addSubview:label];

    NSDictionary *dict = NSDictionaryOfVariableBindings(label);
    [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-8-[label]-8-|" options:0 metrics:nil views:dict]];
    [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-8-[label]" options:0 metrics:nil views:dict]];

    if (indexPath.row == 0) {
        label.textColor = [UIColor colorWithRed:1.0 green:0 blue:0 alpha:1.0];
    }
    else if (indexPath.row == 1) {
        label.textColor = [UIColor colorWithRed:0 green:1.0 blue:0 alpha:1.0];
    }
    else if (indexPath.row == 2) {
        label.textColor = [UIColor colorWithRed:0 green:0 blue:1.0 alpha:1.0];
    }
    else {
        label.textColor = [UIColor colorWithWhite:0.3 alpha:1.0];
    }

    cell.backgroundColor = [UIColor colorWithWhite:1.0 alpha:1.0];
    return cell;
}

У меня 1 секция с 10 рядами. При повторном использовании каждой строки я удаляю все подпредставления из contentView (я пробовал alloc-init UITableViewCell, но получил те же результаты).

В iOS 7.0 UILabel отображается только в той ячейке, которой он принадлежит. Но в версии 7.1 UILabel продолжает отображаться поверх других ячеек. Что интересно, когда я нажимаю на ячейку, она перестает перекрываться другими, но только до тех пор, пока я не нажму на ячейку выше. У меня вопрос, как заставить его работать на устройствах 7.1, как на 7.0ones.

Я попробовал и симулятор, и устройство, и я взглянул на различия API iOS 7.1, но не нашел ничего связанного с этим.

Возможно, это проблема Auto Layout, у меня переменная высота UILabel, но мне нужно это сделать. Я хочу иметь весь текст в UILabel, но отображать только часть UILabel, которая может отображаться в ячейке, что является поведением по умолчанию в 7.0, но 7.1 меняет это, и я не знаю, почему и как с этим бороться.

Это папка dropbox для изображений с подробным объяснением: Папка с изображениями

Обновление: я пробовал такие вещи, как tese, но у меня ничего не работало.

cell.frame = CGRectMake(0, 0, self.tableView.frame.size.width, 70);
cell.contentView.frame = CGRectMake(0, 0, self.tableView.frame.size.width, 70);

cell.opaque = NO;
cell.contentView.opaque = NO;

cell.clearsContextBeforeDrawing = NO;
cell.contentView.clearsContextBeforeDrawing = NO;

cell.clipsToBounds = NO;
cell.contentView.clipsToBounds = NO;

person Matej Kosiarcik    schedule 12.03.2014    source источник


Ответы (7)


Проблема связана с высотой вашей ячейки. Это не будет динамически подстраиваться под вас.

Вы, вероятно, заметите, что когда вы прокручиваете, и изображение выше исчезает из поля зрения, перекрывающийся текст исчезает вместе с ним.

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

lineBreakMode не вступит в силу, так как он не остановлен.

При желании вы можете попытаться установить отсечение для contentView, чтобы убедиться, что все подпредставления остаются внутри.

В зависимости от желаемого конечного результата вы можете делать динамические высоты и изменять их в зависимости от содержимого. Есть множество ТАКИХ вопросов, связанных с этим.

Обновление - обрезка contentView

Мне пришлось бы попробовать это самому, но вместо этого вот пара ссылок, связанных с вырезанием contentView:

Похоже, это работает:

cell.clipsToBounds = YES;
person RyanJM    schedule 12.03.2014
comment
Я заметил, что текст исчезает при прокрутке, и когда я прокручивал его, он выглядел нормально (например, 7.0). Я могу установить количество строк, но это влияет только на UILabel, и когда у меня UIButton ниже UILabel, кнопка продолжает перекрывать ячейки. Поэтому мне нужно более общее решение. Я просто хочу, чтобы все, что находится ниже видимой области, не было видно = ›статическая высота строки 70. Я просто не понимаю, почему это происходит только на iOS 7.1. Вы можете объяснить, это не будет динамически настраивать это для вас. поскольку я не хочу, чтобы он был динамическим, я хочу, чтобы ячейка имела статическую высоту 70. - person Matej Kosiarcik; 12.03.2014
comment
Правильно, если вы хотите иметь статическую высоту 70, вам не нужны динамические высоты. Вам просто нужно убедиться, что представление обрезает подпредставления. Я не уверен, почему 7.0 работает против 7.1, у меня были похожие проблемы в предыдущих версиях. Я добавлю несколько ссылок на свой ответ по этому поводу. - person RyanJM; 12.03.2014
comment
В конце концов я нашел решение: cell.clipsToBounds = YES; это решает мою проблему и хорошо отображается в 7.0 и 7.1. Не понимаю, почему я не нашел в документации, что теперь это необходимо, если вы хотите сделать это, как я. Когда я сейчас читаю ваш комментарий, я обнаружил, что вы упомянули об этом, поэтому вы можете дать ответ, и я помечу его как принятый или сделаю свое. - person Matej Kosiarcik; 12.03.2014
comment
Если вы создаете свою ячейку в построителе интерфейсов, клиповые подвиды на самой ячейке (верхняя из трех) имеют тот же эффект. - person t0PPy; 19.03.2014
comment
Для меня это проблема с iOS 7.1, но не с 7.0, эта версия работает нормально. Но я предполагаю, что обрезка автоматически включается для 7.0. - person Nate Hat; 23.03.2014
comment
Идеальный чувак .. Решил мою проблему и спас мой день .. Большое спасибо. - person MS.; 13.08.2014
comment
час пытался решить эту проблему. Это окончательно решило проблему. Большое спасибо Райан - person Pascal; 04.06.2018

Вот идеальное решение проблемы перекрытия содержимого в ячейках.

Просто используйте приведенный ниже код в cellForRowAtIndexPath после выделения ячейки и перед добавлением подвидов.

for (id object in cell.contentView.subviews)
{
    [object removeFromSuperview];
}  

На самом деле перекрытие происходит, потому что всякий раз, когда вы прокручиваете tableview, он снова и снова выделяет ваше добавленное представление. Таким образом, приведенный выше код решит вашу проблему, удалив существующие представления из contentView ячейки.

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

Надеюсь, это тебе поможет.

Спасибо !

person Gaurav Singla    schedule 11.03.2015
comment
Это не было моей проблемой. Вы описываете ситуацию, когда текущий вид ячейки0 перекрывает предыдущий вид ячейки0. Но проблема заключалась в том, что текущий вид ячейки0 перекрывал текущий вид ячейки1. Кроме того, у меня уже есть этот код, который вы рекомендуете (хотя сейчас я бы предпочел поместить его в метод prepareForReuse). - person Matej Kosiarcik; 17.08.2015

Это проблема с воссозданием содержимого ячейки. Попробуйте со следующим сегментом кода.

for(UIView *view in cell.contentView.subviews){  
        if ([view isKindOfClass:[UIView class]]) {  
            [view removeFromSuperview];   
        }
    }
person Samitha K    schedule 22.09.2014
comment
когда я пишу этот код, ячейки отображаются, но, как мне кажется, код не удаляет старые ячейки. потому что я вижу старые значения под новой ячейкой - person Esqarrouth; 08.12.2014
comment
можете ли вы это проверить: stackoverflow.com/questions/27355545/ - person Esqarrouth; 08.12.2014

@Gaurav, ваш ответ должен быть принятым ответом. Спасибо!

for object in cell.contentView.subviews
            {
                object.removeFromSuperview();
            }
person Emastmagy MastMagy    schedule 07.08.2015
comment
Рад, что мои ответы помогли! - person Gaurav Singla; 11.08.2015

имело аналогичное поведение в iOS 8, используя раскадровку / IB.

Исправление заключалось в добавлении ограничения Bottom Space to: Superview от самого нижнего представления до низа представления содержимого ячейки прототипа. Все остальные взгляды и ограничения были закреплены сверху.

person GraehamF    schedule 01.09.2015

Вы используете раскадровки? Если это так, выберите контроллер табличного представления в раскадровке и снимите флажок «Под нижними панелями». Это также можно сделать программно.

Если ваш TVC наследуется от контроллера представления навигации или контроллера представления вкладок, вам может потребоваться снять флажок с этой опции макета в родительском представлении.

person TooManyEduardos    schedule 12.03.2014
comment
Я пробовал, но, похоже, ничего не сделал. Да, я использую раскадровки, и мой TableViewController принадлежит NavigationController. Я снял галочку на обоих, но ничего не произошло. - person Matej Kosiarcik; 12.03.2014
comment
О, еще одна вещь, которую вы можете попробовать, - это очистить код внутри cellForRowAtIndexPath. Я заметил, что если вы поместите в этот код циклы или какую-то логику, все станет немного странно. Итак: переместите цикл for за пределы (создайте массив или что-то еще для чтения позже) и, возможно, измените операторы if / else для оператора switch и посмотрите, поможет ли это - person TooManyEduardos; 12.03.2014
comment
Пробовал оба, но ничего не помогло. В конце концов я нашел решение: cell.clipsToBounds = YES; это решает мою проблему и хорошо отображается в 7.0 и 7.1. Сбитый с толку, почему я не нашел в документации, что теперь это необходимо, если вы хотите сделать это, как я. Я отправлю ответ, но должен подождать. - person Matej Kosiarcik; 12.03.2014
comment
Это также сработало для меня, установив clipsToBounds = YES. Очень неприятно. - person ToddB; 05.06.2014

Помогает повторная проверка всех 4 ограничений. При работе с табличным представлением или представлением коллекции необходимо применять все четыре ограничения (ведущие, конечные, верхние, нижние).

person Divyansh Jain    schedule 10.11.2019