Резкая анимация UIView

Я использую анимацию UIView для случайной анимации 5 квадратов (UIButton) по экрану. В зависимости от выбора пользователя отображается от 2 до 5 квадратов. Когда видны только 2, остальные три скрытых значения устанавливаются на ДА, поэтому они фактически все еще анимируются (верно?), Они просто не видны. Но когда видны только 2, анимация плавная, но когда видны все пять, анимация становится прерывистой. Я не совсем уверен, как это описать, потому что квадраты все еще движутся с правильной скоростью и перемещаются в правильные точки; волнение не ужасно, просто достаточно, чтобы быть заметным. Есть ли способ избавиться от этого? Это код, который я использую для анимации квадратов:

Изменить: изменена анимация на блокировку:

[UIView animateWithDuration:animationSpeed 
                              delay:0 
                            options:UIViewAnimationOptionCurveLinear 
                         animations:^{
                             view.center = destPoint;
                         }
                         completion:^(BOOL finished){
                             if([view isEqual:squareThree])
                                 [self moveBadGuys];
                         }
         ];

/*for(UIButton* button in squareArray) {
    if(!shouldMove)
        return;

    [UIView beginAnimations:@"b" context:nil];
    [UIView setAnimationDuration:animationSpeed];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
    view.center = destPoint;
    [UIView commitAnimations];
}*/

Изменить: представление, представляющее это, является третьим в стеке из трех UIViewController, представленных с

ViewController* controller = [[[ViewController alloc] init] autorelease];
[self presentModalViewController:controller animated:NO];

Разъедает ли такой способ представления взглядов память?


person eric.mitchell    schedule 15.11.2011    source источник
comment
Может быть, у вас мало памяти?   -  person SimplyKiwi    schedule 15.11.2011
comment
Я так и думал, и я не очень хорошо знаю, с каким объемом памяти должен работать iPhone или насколько создание одного IBOutlet истощает ваши ресурсы, но у меня довольно много IBOutlet в этом контроллере представления.   -  person eric.mitchell    schedule 15.11.2011
comment
Нет, такой способ представления взглядов не съедает память. Вместо оператора for попробуйте просто делать по одной анимации за раз и посмотреть, все ли возникают волнения.   -  person SimplyKiwi    schedule 15.11.2011
comment
Да, это остановило нервозность, которая для меня не имеет смысла, потому что даже когда движутся только два квадрата (и они не изменчивы), другие скрыты, но все еще движутся, верно?   -  person eric.mitchell    schedule 15.11.2011
comment
Я немного запутался, это помогло решить вашу проблему? В противном случае, если вы хотите, чтобы невидимые объекты переместились в определенную точку, не анимируйте ее, просто выполните CGPointMake.   -  person SimplyKiwi    schedule 15.11.2011
comment
Я не хочу, чтобы невидимые двигались. Нет, это не решило мою проблему. Моя проблема в том, что когда я анимирую 5 квадратов, анимация получается прерывистой. Забудьте о спрятанном, это не важно   -  person eric.mitchell    schedule 15.11.2011
comment
Вы знаете, движутся ли невидимые объекты?   -  person SimplyKiwi    schedule 15.11.2011
comment
Они есть; Я понял, что действительно проблема в памяти. self.view фактически удалял подвиды квадратов, которые я хотел скрыть, их скрытые значения не менялись. Это причина повышения производительности. Но как мне повысить эффективность анимации с движением 5 квадратов? Есть способ? Или мне просто приходится жить с неоптимальной скоростью   -  person eric.mitchell    schedule 15.11.2011
comment
Несомненно, есть способ исправить это. Итак, чтобы было ясно, что невидимые движутся, но вы НЕ хотите, чтобы они двигались? Возможно, когда кнопки станут невидимыми, удалите связанную с ними анимацию UIView и посмотрите, поможет ли это. Также попробуйте построить и проанализировать все, что вы могли пропустить!   -  person SimplyKiwi    schedule 15.11.2011
comment
Также, если это игра, я рекомендую вам использовать Cocos2D, потому что она предназначена для подобных вещей.   -  person SimplyKiwi    schedule 15.11.2011
comment
Да, это игра, но она вышла именно такой, как я хотел, до этого момента, как я это делал. Нет; невидимые НЕ движутся, потому что они были удалены из их супервизоров; их больше не существует. Проблема возникает не при их удалении, а при наличии всех пяти квадратов. Когда присутствуют все пять, анимация, перемещающая квадрат по экрану, будет прерывистой.   -  person eric.mitchell    schedule 15.11.2011
comment
Хм, это странно. Вы пробовали Core Animation?   -  person SimplyKiwi    schedule 15.11.2011
comment
Нет, я этого не делал; каков будет синтаксис для перемещения объекта из CGPoint «a» в CGPoint «b» с заданным временем «продолжительности»? И CoreAnimation.h импортируется путем импорта QuartzCore.h, верно?   -  person eric.mitchell    schedule 15.11.2011
comment
да, я так считаю. В сети есть несколько руководств, показывающих, как выполнять Core Animation.   -  person SimplyKiwi    schedule 15.11.2011


Ответы (2)


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

На кнопках есть большие изображения? От кнопок отбрасывают тени? Эти вещи могут замедлить его.

Также используйте блочную анимацию. Не старые методы начала фиксации.

person Dancreek    schedule 15.11.2011
comment
Хорошо, я поменяю их на заблокированные. Но нет, у них нет теней или сложных изображений; они твердые UIColors, и да, я тестирую на реальном оборудовании. На самом деле производительность на симуляторе намного лучше, что наводит меня на мысль, что проблема в памяти (которой в компьютере гораздо больше). - person eric.mitchell; 15.11.2011
comment
Использование begin-commit вместо block на самом деле не вредит производительности, верно? - person eric.mitchell; 15.11.2011
comment
Никогда не доверяйте характеристикам симулятора - его характеристики полностью отличаются от характеристик устройства. Да, у вашего компьютера больше памяти, но он также имеет гораздо более быстрый процессор и графический процессор. - person Noah Witherspoon; 15.11.2011
comment
Да, но это возвращает меня к моей исходной проблеме. Вроде бы память точно проблема. Но как сохранить память в такой ситуации? - person eric.mitchell; 15.11.2011

Не совсем уверен, почему это так медленно, но пробовали ли вы по-другому вложить эту штуку?

if(!shouldMove)
    return;

[UIView beginAnimations:@"b" context:nil];
[UIView setAnimationDuration:animationSpeed];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

for(UIButton* button in squareArray) {
    view.center = destPoint;
}

[UIView commitAnimations];

делает (почти - логика немного другая в случае !shouldMove, но это другая история) то же самое, но более чистым способом.

person Eiko    schedule 15.11.2011
comment
Хотя это кажется более чистым, он переместил бы все квадраты в одну и ту же точку, что как бы противоречит цели наличия нескольких квадратов: D - person eric.mitchell; 15.11.2011
comment
Подвижная часть эквивалентна. Код, который вы показали, делает то же самое. - person Eiko; 15.11.2011
comment
Ой, извини! В моем коде я не показал, что получаю разные случайные точки для каждого UIButton; Я не думал, что это имеет отношение к делу. Но да, вы правы, этот код эквивалентен коду, который я опубликовал. Прости! - person eric.mitchell; 15.11.2011