Устройство зависает, когда выполняется много анимации UIView с UILabels с использованием теней, и я нажимаю кнопку «Домой».

У меня возникли некоторые проблемы в моем приложении. Ошибка возникает, когда я нахожусь на экране с множеством значков (UIViews), каждый из которых запускает анимацию. Этот экран напоминает экран трамплина, и визуальная анимация тоже похожа.

Итак, если я нажимаю кнопку «Домой», приложение не переходит в фоновый режим, и я ничего не могу сделать. Даже кнопка питания не работает. А иконки продолжают трястись.

Если я уберу вызов метода создания ярлыка, этого не произойдет.

Любой совет?

Спасибо!

Метод анимации (взято из Three20 api):

- (void)wobble {
    static BOOL wobblesLeft = NO;

    if (isEditing)
    {
        CGFloat rotation = (kWobbleRadians * M_PI) / 180.0;
        CGAffineTransform wobbleLeft = CGAffineTransformMakeRotation(rotation);
        CGAffineTransform wobbleRight = CGAffineTransformMakeRotation(-rotation);

        [UIView beginAnimations:nil context:nil];

        NSInteger i = 0;
        NSInteger nWobblyButtons = 0;



        for(Icon *ic in iconList)
        {
            ++nWobblyButtons;
            i++;
            if (i % 2)
            {
                ic.transform = wobblesLeft ? wobbleRight : wobbleLeft;

            } else {
                ic.transform = wobblesLeft ? wobbleLeft : wobbleRight;
            }
        }


        if (nWobblyButtons >= 1)
        {
            [UIView setAnimationDuration:kWobbleTime];
            [UIView setAnimationDelegate:self];
            [UIView setAnimationDidStopSelector:@selector(wobble)];
            wobblesLeft = !wobblesLeft;

        } else {
            [NSObject cancelPreviousPerformRequestsWithTarget:self];
            [self performSelector:@selector(wobble) withObject:nil afterDelay:kWobbleTime];
        }

        [UIView commitAnimations];
    }
}

Создание этикетки

-(void)layoutLabel
{
    // If title isn`t builded.
    if(_lblName == nil)
    {
        // Create new label.
        _lblName = [[UILabel alloc] initWithFrame:CGRectMake(LABEL_POS_X,
                                                             LABEL_POS_Y,
                                                             LABEL_WIDTH,
                                                             LABEL_HEIGHT)];

        // Clear the background.
        [_lblName setBackgroundColor:[UIColor clearColor]];

        // Sets the font.
        [_lblName setFont:[UIFont fontWithName:@"Helvetica-Bold" size:11.3]];
        [_lblName setAdjustsFontSizeToFitWidth:NO];

        // Sets text color
        [_lblName setTextColor:[UIColor whiteColor]];

        // Adjust the number of lines.
        [_lblName setNumberOfLines:2];

        // Adjust the aligment to center.
        [_lblName setTextAlignment:UITextAlignmentCenter];

        // Adjust shadow like the springboad`s icons.
        _lblName.layer.shadowOpacity = 1.0;
        _lblName.layer.shadowRadius = 0.8;
        _lblName.layer.shadowColor = [[UIColor blackColor] CGColor];
        _lblName.layer.shadowOffset = CGSizeMake(0, 1.2);

        // Add label to container.
        [self addSubview:_lblName];
    }
}

person Danilo Gomes    schedule 18.05.2012    source источник


Ответы (2)


Проблема в:

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

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

+ (UIImage *) imageWithView:(UIView *)view
{
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return img;
}

Это увеличило мой FPS с ~ 15 до 60 O.o.

Следуйте некоторой помощи, которую я нашел Ссылка

person Danilo Gomes    schedule 21.05.2012

Тени вообще плохо анимируются. Отключите их во время анимации и снова включите после завершения анимации.

У меня не было зависаний при анимации с тенями, но производительность недопустимо дергается. По моему опыту, попытки анимировать все, что имеет тени, приводит к неприемлемым результатам.

person Duncan C    schedule 19.05.2012
comment
Действительно, тени слишком сильно замедляют мой код. Но мне нужно использовать тени, это приказ моей команды дизайнеров, хахаха. Спасибо. - person Danilo Gomes; 21.05.2012