2015-05-12 10 views
2

Я пытаюсь добавить эффект вибрации к текстовой метке моей таблицы представления таблицы, и это похоже на работу, но не совсем правильно.Добавление 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; 
} 

enter image description here

ответ

0

Я думаю, что я вижу две основные проблемы с вашим кодом. Первой проблемой, по-видимому, является тот факт, что ячейки в 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 вашего подкласса ячейки.

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

+0

Ваше предположение о правильности размера экрана. Я просто посмотрел на него на iPhone 5, и похоже, что я хочу этого. – raginggoat

+0

Да, это проблема, с которой я сталкиваюсь все время. -willDisplayCell может отлично работать для вас, если вы выясните, как убедиться, что представление добавляется только один раз. Альтернативой подклассу, если вы действительно пытаетесь избежать его по какой-то причине, может быть предоставление представления, которое вы добавляете в тег, и добавляете его только в том случае, если ячейка не содержит subview с этим тегом. Тогда проблема заключается в том, что вы будете выполнять итерации над подзонами этой ячейки в методе, который действительно должен выполнить свою работу как можно быстрее, чтобы не сделать таблицу вялой. – Dare

 Смежные вопросы

  • Нет связанных вопросов^_^