Ускорьте UITableView с UIImages в качестве фона и UIImages в detailView - PullRequest
0 голосов
/ 16 октября 2011

Я делаю приложение для инвентаризации и подклассифицировал сгруппированный UITableView, для которого я сделал фон UIImage, который я установил после инициализации на основе местоположения (top, middle, bottom, single).Затем я установил детализацию изображения и текста на основе кэшированного массива категорий и инструментов.Проблема в том, что при стресс-тестировании (или тестировании вообще) это происходит очень медленно.Может кто-нибудь показать мне, почему это работает медленно и / или дать мне несколько указателей, чтобы сделать это быстрее?

Вот как это должно выглядеть:

tableview in quetion

Вот код для подкласса UITableViewCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
        self.backgroundImage = [[[UIImageView alloc] initWithFrame:CGRectMake(-3, 0, 305.0f, 50)] autorelease];
        self.roundedImageView = [[[UIImageView alloc] initWithFrame:CGRectMake(10, 8, 33, 33)] autorelease];
        self.label = [[[UILabel alloc] initWithFrame:CGRectMake(50, 7, 140, 40)] autorelease];
        self.topDes = [[[UILabel alloc] initWithFrame:CGRectMake(215, 5, 100, 15)] autorelease];
        self.botDes = [[[UILabel alloc] initWithFrame:CGRectMake(215, 18, 100, 35)] autorelease];
        self.midDes = [[[UILabel alloc] initWithFrame:CGRectMake(215.0f, 15.0f, 80.0f, 22.0f)] autorelease];
        [self.contentView addSubview:self.backgroundImage];
        [self.contentView addSubview:self.roundedImageView];
        [self.contentView addSubview:self.label];
        [self.contentView addSubview:self.topDes];
        [self.contentView addSubview:self.midDes];
        [self.contentView addSubview:self.botDes];

        //Set properties for labels and images

        [self prepareForReuse];

    }
    return self;
}

Вот код для создания ячеек для просмотра таблицы

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    if (searching == NO) {

        NSString *CellIdentifier = [NSString stringWithFormat:@"%d, %d", indexPath.section, indexPath.row];
        OBcell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (cell == nil) {
            cell = [[[OBcell alloc]
                     initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]
                    autorelease];
            NSString *CellIdentifier = [NSString stringWithFormat:@"%d, %d", indexPath.section, indexPath.row];
        OBcell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (cell == nil) {
            cell = [[[OBcell alloc]
                     initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]
                    autorelease];
            if (searching == NO) {
                if (indexPath.row == 0) {
                    if ([tableView numberOfRowsInSection:indexPath.section] == 1) {
                        cell.backgroundImage.image = singleTableImage;
                    } else {
                        cell.backgroundImage.image = topTableImage;
                    }
                } else if (indexPath.row < [tableView numberOfRowsInSection:indexPath.section] - 1) {
                    cell.backgroundImage.image = middleTableImage;
                } else {
                    cell.backgroundImage.image = bottomTableImage;
                }
                if (type == OBViewTypeTools) {
                    if ([[[[primaryArray objectAtIndex:indexPath.section] objectAtIndex:5] objectAtIndex:indexPath.row] integerValue] > 0) {
                        if (indexPath.row == 0) {
                            if ([tableView numberOfRowsInSection:indexPath.section] == 1) {
                                cell.backgroundImage.image = singleTableImageRed;
                            } else {
                                cell.backgroundImage.image = topTableImageRed;
                            }
                        } else if (indexPath.row < [tableView numberOfRowsInSection:indexPath.section] - 1) {
                            cell.backgroundImage.image = middleTableImageRed;
                        } else {
                            cell.backgroundImage.image = bottomTableImageRed;
                        }
                    }
                }
            }
        }

            //Just pay attention to the cell.roundedImageView mainly, I'm thinking that's the problem unless you guys think it's something else...

        switch (type) {
            case OBViewTypeTools:;
                cell.label.text = (NSString*)[[[primaryArray objectAtIndex:indexPath.section] objectAtIndex:2] objectAtIndex:indexPath.row];
                cell.roundedImageView.image = [[[primaryArray objectAtIndex:indexPath.section] objectAtIndex:1] objectAtIndex:indexPath.row];
                cell.topDes.text = [NSString stringWithFormat:@"Total: %d", [[[[primaryArray objectAtIndex:indexPath.section] objectAtIndex:3] objectAtIndex:indexPath.row] integerValue]];
                cell.topDes.textColor = [UIColor yellowColor];
                cell.topDes.font = smallFont;
                cell.botDes.text = [NSString stringWithFormat:@"In Use: %d", [[[[primaryArray objectAtIndex:indexPath.section] objectAtIndex:4] objectAtIndex:indexPath.row] integerValue]];
                cell.botDes.textColor = [UIColor blueColor];
                cell.botDes.font = smallFont;
                break;
            case OBViewTypeCategories:;
                ToolCategory *cat = (ToolCategory*)[primaryArray objectAtIndex:indexPath.row];
                cell.label.text = cat.name;
                cell.midDes.textColor = [UIColor lightGrayColor];
                cell.midDes.font = smallFont;
                cell.midDes.text = [NSString stringWithFormat:@"Tools: %d", [[cat tools] count] == 0 ? 0 : [[cat tools] count]];
                cell.roundedImageView.image = cat.image;
                break;
            case OBViewTypeJobs:
                cell.label.text = ((Job*)[primaryArray objectAtIndex:indexPath.row]).name;
                cell.roundedImageView.image = ((Job*)[primaryArray objectAtIndex:indexPath.row]).image;
                cell.midDes.text = [NSString stringWithFormat:@"Tools: %d", [((Job*)[primaryArray objectAtIndex:indexPath.row]).tools count]];
                cell.midDes.font = smallFont;
                cell.midDes.textColor = [UIColor lightGrayColor];
                break;
            case OBViewTypeJobTools:
                cell.label.text = [((Tool*)[[[((ToolCategory*)[primaryArray objectAtIndex:indexPath.section]) tools] sortedArrayUsingDescriptors:sortDescriptors] objectAtIndex:indexPath.row]) name];
                cell.roundedImageView.image = [((Tool*)[[[((ToolCategory*)[primaryArray objectAtIndex:indexPath.section]) tools] sortedArrayUsingDescriptors:sortDescriptors] objectAtIndex:indexPath.row]) image];
                cell.midDes.text = [NSString stringWithFormat:@"(%d)", [[((ToolCategory*)[primaryArray objectAtIndex:indexPath.section]) tools] count]];
                cell.midDes.font = smallFont;
            case OBViewTypeToolJobs:
                cell.label.text = [((Job*)[secondaryArray objectAtIndex:indexPath.row]) name];
                cell.roundedImageView.image = [((Job*)[secondaryArray objectAtIndex:indexPath.row]) image];
                cell.midDes.textColor = [UIColor blueColor];
                cell.midDes.text = [NSString stringWithFormat:@"(%d)", [((Job*)[secondaryArray objectAtIndex:indexPath.row]) amountForTool:(Tool*)primaryObject]];
                cell.midDes.font = smallFont;
                break;
        }
        cell.clipsToBounds = NO;
        cell.layer.masksToBounds = NO;
        cell.backgroundColor = [UIColor clearColor];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        return cell;
}

1 Ответ

1 голос
/ 16 октября 2011

Существует ряд потенциальных проблем с вашей настройкой, включая следующие:

1) Ваш идентификатор повторного использования ячейки очень странный

NSString *CellIdentifier = [NSString stringWithFormat:@"%d, %d",   
                                            indexPath.section, indexPath.row];

Идентификатор повторного использования ячейки должен бытьстатическая строка NSString, используемая для удаления ячеек.Не повторное использование ячеек очень дорого, потому что новые ячейки должны быть созданы, а не повторно использованы.Как видно на скриншоте примера, все эти ячейки практически одинаковы, поэтому вы должны использовать один и тот же идентификатор повторного использования:

static NSString *CellIdentifier = @"InventoryItemCell";

2) Вы используете много альфа-прозрачности в своих ячейках.В Core Animation для смешивания альфа-каналов требуется дополнительная вычислительная мощность, а прозрачность должна быть максимально сведена к минимуму, особенно в UITableView.Вы можете запустить Core Animation Instrument, чтобы узнать, сколько альфа используется в вашем приложении, включив опцию отладки Color Blended Layers:

enter image description here

.наложение, чтобы показать вам, какие части вашего приложения смешиваются в цвете.Зеленый непрозрачный, красный - альфа:

enter image description here

Цель этого состоит в том, чтобы минимизировать количество красного (плохого!) На экране, насколько это возможно, когда происходят анимации.Иногда, не все это может быть устранено из-за требований к дизайну, но максимально возможное его уменьшение даст хорошие результаты.

3) Я не уверен, как вы выполняете закругленные углы на ваших изображениях,но это очень дорого для анимации в табличном представлении, если вы делаете это, округляя углы в CALayer UIImageView.Если вы делаете это в коде, не надо.Гораздо эффективнее сохранять изображения с уже округленным изображением.(Но помните, опять же, о штрафе, понесенном с альфа-смешением!)

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