Добавление 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 вашего подкласса ячейки.
Это гарантирует, что представление будет добавлено только один раз, и кадр будет соответствовать ожидаемому.