Подтвердить что ты не робот

IOS 7.1 Содержимое UitableviewCell перекрывается с приведенными ниже

Итак, у меня есть код, который успешно работает на 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 стрелками. При повторном использовании каждой строки я удаляю все subviews из contentView (я попробовал alloc-init UITableViewCell, но пришел с теми же результатами).

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

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

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

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

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

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;
4b9b3361

Ответ 1

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

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

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

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

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

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

Обновление - отсечение содержимогоView

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

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

cell.clipsToBounds = YES;

Ответ 2

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

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

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

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

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

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

Спасибо!

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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