Округление UIImages в UITableView вызывает замедление - PullRequest
0 голосов
/ 12 марта 2012

Когда я пытаюсь округлить UIImages во всех пользовательских UITableViewCells, прокрутка 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;
}

Ответы [ 2 ]

3 голосов
/ 12 марта 2012

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

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

0 голосов
/ 12 марта 2012

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

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

- (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) Следуя ответу Бартоша Цехановского, вы можете динамически создавать необходимый overlayImage для каждого размера, получаемого с помощью CorGraphics. Но первое решение может быть самым простым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...