Анимация выбора UIButton - PullRequest
       22

Анимация выбора UIButton

1 голос
/ 09 ноября 2010

Всем доброго московского вечера!

Я все еще незнаком с принципами анимации iPhone (кстати, кто-нибудь знает большой и хороший учебник по этому вопросу?), Но в моем проекте я хочу сделать кнопкуМерцание «подсвечено-не подсвечено» для уведомления пользователя об изменении его метки.

Этот код ничего не делает (это просто фрагмент анимации мерцания):

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration: 0.5]; 

[button setHighlighted: YES];

[UIView commitAnimations];

Иэтот подсвечивает кнопку, но не делает это в виде анимации:

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration: 0.5]; 

[button setSelected: YES];

[UIView commitAnimations];

Кто-нибудь может мне помочь и сказать:

  1. Что не так с этим кодом?
  2. Что бы решить проблему?

----------------------------------- ОБНОВЛЕНИЕ ------------------------------

Я пробовал такой код, но это не таклибо не работает:

// ------------------------
// --- animation ----------
// ------------------------

- (void)animateIn
{
[UIView beginAnimations: @"animateIn" context:nil]; 
[UIView setAnimationDuration: 0.2];

[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)]; 

[control setBackgroundColor:[UIColor blackColor]];

[UIView commitAnimations];
}

- (void)animateOut
{
[UIView beginAnimations: @"animateOut" context:nil];    
[UIView setAnimationDuration: 0.2];

[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)]; 

[control setBackgroundColor:[UIColor whiteColor]];

[UIView commitAnimations];
}


- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
if([animationID isEqualToString: @"animateIn"])
{
    [self animateOut];
    return;
}
else if ([animationID isEqualToString: @"animateOut"])
{
    cycleCount++;

    if(cycleCount < 3)
        [self animateIn];
    else
        cycleCount = 0;

    return;
}
}

@end

Ответы [ 3 ]

2 голосов
/ 10 ноября 2010
//isFlickerOn is declared in .h file as BOOL isFlickerOn;
//flickerTimer is declared in .h file as NSTimer *flickerTimer;
//flickerCount is declared in .h file as int flickerCount; 
//control is a UILabel, UIButton background color is really hard to notice
//especially the roundedRect UIButton, so I just flickered a UILabel's textColor

-(void)flickerOn {
    if (flickerCount < 5) 
    {
    flickerCount++;
         if (!isFlickerOn)
        {
            [control setTextColor:[UIColor yellowColor]];
            isFlickerOn = YES;
        } 
        else
        {
            [control setTextColor:[UIColor blueColor]];
            isFlickerOn = NO;   
        }
    }
    else 
    {
        [flickerTimer invalidate];
    }
}


-(void)flickerAnimation {
    flickerCount = 0;
    flickerTimer = [NSTimer scheduledTimerWithTimeInterval:0.3f target:self selector:@selector(flickerOn) userInfo:nil repeats:YES];
}
1 голос
/ 09 ноября 2010

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

[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
[UIView beginAnimations:@"animateIn" context:NULL];

Из документов Apple:

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {

Ваш метод должен принимать следующие аргументы:

animationID

NSString, содержащая необязательный идентификатор, предоставляемый приложением. Это идентификатор, который передается в метод beginAnimations: context:. Этот аргумент может быть ноль.

закончил

Объект NSNumber, содержащий логическое значение. Значение YES, если анимация дошла до завершения, прежде чем она остановилась, или NO, если это не так.

контекст

Необязательный контекст, предоставляемый приложением. Это данные контекста, передаваемые в beginAnimations: context: метод. Этот аргумент может быть ноль.

Когда анимация завершается, вызывается callback animationDidStop и передается в строке @ "animateIn". Вы можете использовать этот метод, чтобы проверить, какая анимация была вызвана, и обработать ее.

1 голос
/ 09 ноября 2010

Не все атрибуты UIView являются анимируемыми - и я не верю, что "выделено" или "выбрано".

Как правило, его можно использовать для не булевых значений, таких как "center", "alpha", "frame" и "bounds".

Попробуйте вместо этого настроить альфу, и вы увидите, что она будет работать.

...