/ / Искате трептене на UIImageView (CoreAnimation и алфа-стойност) - iphone, object-c, ядро

Искате трептене на UIImageView (CoreAnimation и алфа стойност) - iphone, objective-c, core-animation

Бих искал да имам UIImageView, който трепти. Аз thougt мога да го направя с CoreAnimation и алфа-стойност. Опитах това:

for (int a = 1; a <= 100; a++) {
schwarz.alpha = 0.7;
[UIView beginAnimations:nil context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationDuration:1];
schwarz.alpha = 0,1;
[UIView commitAnimations];
}

но това не върши работа. Той просто се движи до 0,1, а не отново до 0,7. Опитах и ​​това:

schwarz.alpha = 0.7;
[UIView beginAnimations:nil context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationDuration:1];
schwarz.alpha = 0.1;
[UIView commitAnimations];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationDuration:1];
schwarz.alpha = 1;
[UIView commitAnimations];
[UIView commitAnimations];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationDuration:1];
schwarz.alpha = 3;
[UIView commitAnimations];
// and so on...

И отново го прави работа. Как мога да реализирам трептенето? Благодаря!

Отговори:

2 за отговор № 1

Проблемът с кода е, че [UIViewcommitAnimation] методът не блокира - искам да кажа, че изпълнението на кода продължава и анимацията се извършва асинхронно. Така че, всъщност, това, което се случва, е, че първо преминавате през всички циклични итерации, а след това анимацията се извършва от 0.7 до 1.0 ...

Просто използвайте setAnimationDidStopSelector без цикъла "за".

schwarz.alpha = 0.7;
[UIView beginAnimations:nil context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationDuration:1];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
schwarz.alpha = 0.1;
[UIView commitAnimations];

Методът на улов може да бъде:

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
/* Do your things here... */ }

1 за отговор № 2

Всички UIView анимации, добавени в един цикъл от събития, са основно сливани. Трябва да използвате UIView animationDidStopSelector. Например, вижте следното:

-(void)tileAnimate:(NSString*)animationID finished:(BOOL)finished context:(void*)context  {
int position = [animationID intValue];
NSString *next = [NSString stringWithFormat:@"%d", position+1];
if(position == boardSize) {
return;
}
[UIView beginAnimations:next context:context];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDuration:timing];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(tileAnimate:finished:context:)];
buttons[position].transform = CGAffineTransformIdentity;
[UIView commitAnimations];
}

Използвам това, един след друг, анимирам свиването на масив от бутони обратно към нормалните им размери.


1 за отговор № 3

Още две неща:

На първо място, UIViewAnimationCurveEaseIn не работи избледняване мисля.

Второ, в оригиналния код казвате:

schwarz.alpha = 0,1;

Имайте предвид, че там има запетая, а не точка. Интересното е, че кодът се компилира, но вероятно не прави това, което сте възнамерявали.


1 за отговор № 4

Ето още един пример за това. Аз не използвам избледняване, но мисля, че трептящият ефект е все още хубав.

http://github.com/st3fan/iphone-experiments/tree/master/Miscellaneous/Flicker/


0 за отговор № 5

Използвайте първия публикуван код, но вземете for и добавете редовете

[UIView setAnimationRepeatAutoreverses:YES];
[UIView setAnimationRepeatCount:(float)number];

Мисля, че -1 за броя трябва да се повтаря за неопределено време, но аз не съм 100% сигурен в това.