2012-03-11 2 views
0

Когда я пытаюсь объединить UIImages во всех пользовательских UITableViewCells, прокрутка UITableView значительно медленнее и не является текучей. Есть ли лучший способ этого?Round UIImages в UITableView вызывает замедление

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    cell.profileLabel.text = [[demoArray objectAtIndex:[indexPath row]] objectForKey:@"name"]; 
cell.imageView.image = [UIImage imageNamed:[[demoArray objectAtIndex:[indexPath row]] objectForKey:@"image"]]; 
    cell.imageView.layer.cornerRadius = 9.0; 
    cell.imageView.layer.masksToBounds = YES;  
    return cell; 
} 

ответ

0

1) Вы можете создать округленные изображения в viewDidLoad (или когда ваши данные готовы) и сохранить их во временном массиве. Для этого вы просто создаете его, как вы делаете это сейчас. Затем вы записываете содержимое представления в новое изображение. После этого вы показываете вновь созданное изображение в виде таблицы без динамической маскировки.

Чтобы сохранить viewcontents в изображение, вы можете использовать этот код:

- (UIImage*) screenshotOfView: (UIView*) view 
{ 
    UIGraphicsBeginImageContext(view.frame.size); 
    [view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return viewImage; 
} 

ОК, я буду более конкретно. В тот момент, когда ваш demoArray заполнен данными. Вы перебираете этот массив и предварительно визуализируете свои изображения. То, как вы это сделать (с помощью упомянутого метода):

for(NSDictionary* dictionary in demoArray) 
{ 
    UIImage* originalImage = [UIImage imageNamed:[dictionary objectForKey:@"image"]]; 

    UIImageView* tmpImageView = [[UIImageView alloc] initWithImage: originalImage]; 
    tmpImageView.layer.cornerRadius = 9.0; 
    tmpImageView.layer.masksToBounds = YES; 

    UIImage* roundedImage = [self screenshotOfView: tmpImageView]; 
    [dictionary setObject: roundedImage forKey: @"roundedImage"]; 
} 

Затем в методе cellForTableRow, вы просто использовать это изображение:

cell.imageView.image = [UIImage imageNamed:[[demoArray objectAtIndex:[indexPath row]] objectForKey:@"roundedImage"]]; 

(Этот код не проверял, просто записал ...)

2) Еще одним возможным решением было бы сделать образы в вашем подклассе tableViewCell в пределах drawRect: (в масках через CoreGraphics), но это намного сложнее.

3) После ответа Bartosz Ciechanowski вы можете создать необходимый overlayImage динамически для каждого размера, который вы используете с помощью CorGraphics. Но первое решение может быть самым простым.

+0

Я не понимаю вашего ответа. Изображения в моем приложении будут загружены из Интернета и сохранены в demoArray. Какое содержимое я должен захватить? – Flocked

+0

Я добавил пример кода и описал его дальше. – calimarkus

3

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

Создайте наложение в любом графическом редакторе - заполните углы так, чтобы они соответствовали желаемой форме, используя тот же цвет, что и фон ячейки. Теперь добавьте в свою ячейку новый UIImageView, разместите его прямо над вашими изображениями и убедитесь, что наложение остается сверху.

+0

Я не могу этого сделать, потому что ячейки имеют разную высоту, а также UIImage (с градиентом) в качестве фона ячейки. – Flocked

+0

блестящий и простой !!!! –

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