好好的莫斯科晚会给大家!
我还不熟悉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];
任何人都可以帮助我并说:
-----------------------------------更新----------- -------------------
我试过那种代码,但它也不起作用:
// ------------------------
// --- 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
答案 0 :(得分:2)
//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 :(得分:1)
不是 UIView的所有属性都是可动画的 - 我不相信“突出显示”或“选中”。
通常,它可用于非布尔值,例如“center”,“alpha”,“frame”和“bounds”。
尝试改为调整alpha,你会发现它会起作用。
答案 2 :(得分:1)
您需要创建一个在第一个动画结束时执行的回调方法。您使用该回调来创建取消选择的动画。请记住,没有像透明度那样渐进的“选择状态”。你必须使用
[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:方法的上下文数据。这个论点可以是零。
动画结束后,调用回调animationDidStop并传入字符串@“animateIn”。您可以使用该方法来检查调用哪个动画并在那里处理。