Добавление UIVibrancyEffect в ячейку UITableView

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];
    NSDictionary *jobDictionary = [self.jobs objectAtIndex:[indexPath row]];

    if (cell == nil) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"UITableViewCell"];
    }

    if (cell) {
        cell.backgroundColor = [UIColor clearColor];
        cell.textLabel.textColor = [UIColor whiteColor];

        cell.textLabel.text = [jobDictionary objectForKey:@"job"];

        UIBlurEffect *blur = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
        UIVisualEffectView *blurView = [[UIVisualEffectView alloc]initWithEffect:blur];
        blurView.frame = cell.bounds;
        [cell addSubview:blurView];
        UIVisualEffectView *vibrantView = [[UIVisualEffectView alloc]initWithEffect:[UIVibrancyEffect effectForBlurEffect:blur]];
        vibrantView.frame = blurView.bounds;
        [vibrantView.contentView addSubview:cell.textLabel];

        [blurView.contentView addSubview:vibrantView];
    }

    return cell;
}

1 ответ

Я думаю, что вижу две основные проблемы с вашим кодом. Первая проблема заключается в том, что ячейки в cellForRowAtIndexPath имеют ширину 320 при снятии с очереди для отображения на экране iPhone 4 или 5. Если этот снимок экрана сделан с 6 или 6+, это объясняет странный разрыв. Где-то после этого метода ячейка изменяет размеры, чтобы вместить всю ширину таблицы. Это означает, что когда вы устанавливаете blurView.frame = cell.bounds, границы в этой точке на самом деле слишком узкие. Гипотетически это можно исправить, переместив этот код в следующий метод с одним серьезным предостережением.

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

Хотя добавление вашего вида размытия здесь должно дать вам правильный кадр, добавление подпредставления в любом из этих методов приведет к серьезным проблемам при переработке ячейки. Каждый раз, когда эта ячейка удаляется, к ней добавляется новое подпредставление, и они со временем будут продолжать складываться. Это вызовет визуальные проблемы, если они не будут полностью непрозрачными, и это также даст возможность вашей ячейке требовать ОГРОМНОГО количества памяти, потому что теоретически вы могли бы размещать сотни подпредставлений в ячейке при прокрутке таблицы.

Я думаю, что лучшим решением вашей проблемы было бы создание подкласса UITableViewCell и добавление представления -initWithStyle:reuseIdentifier:. Там вы также можете ограничить это представление сверху, снизу, впереди и сзади суперпредставления, чтобы оно всегда корректно изменяло размер. Альтернативой является установка фрейма подпредставления в -layoutSubviews вашего подкласса ячейки.

Это гарантирует, что представление будет добавлено только один раз, и кадр будет соответствовать ожидаемому.

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