我正在开发一个单词查找应用程序。我想要从iPhone的屏幕顶部掉下一些单词。
屏幕底部会有一条红线。
用户必须在到达红线前选择正确的单词。
那么如何在iphone中实现下降效果(即单词效果)。
任何人都可以帮助我。
提前致谢。
答案 0 :(得分:3)
您可以使用UIView动画实现此功能。此示例代码全部位于视图控制器中,并在视图中添加了单个标签fallingLabel
。您可以将其展开以包含多个标签。
关键是要导入QuartzCore
框架。这使您可以访问视图的presentationLayer
,该视图保存动画视图的当前状态。您可以在Xcode的项目摘要部分中将框架添加到项目中,然后将以下内容放在视图控制器的实现文件的顶部:
#import <QuartzCore/QuartzCore.h>
以下代码为标签的删除设置动画。由于UIViewAnimationOptionCurveEaseIn
设置下降速度会增加速度,从而为您提供令人信服的重力效果。
self.fallingLabel.center = CGPointMake(160,50);
[UIView animateWithDuration:3
delay:0
options:UIViewAnimationOptionCurveEaseIn
animations:^{self.fallingLabel.center = CGPointMake(160,400);}
completion:nil];
现在,您需要实现触摸处理。这不是在标签上完成的,因为在内部它会认为它已经在屏幕的底部。您可以处理视图控制器中的触摸:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint touchLocation = [touch locationInView:self.view];
if ([self.fallingLabel.layer.presentationLayer hitTest:touchLocation])
{
NSLog(@"Label was touched");
CALayer *presLayer = self.fallingLabel.layer.presentationLayer;
[UIView animateWithDuration:0
delay:0
options:UIViewAnimationOptionBeginFromCurrentState
animations:^{self.fallingLabel.frame = presLayer.frame;}
completion:nil];
}
}
在这里,正在发生的是查询表示层以查看触摸是否落在其当前界限内。如果是这样,我们然后开始一个新的动画,从当前状态开始 - 在这种情况下,我所做的只是停止标签的掉落,但你可以在这里实现你喜欢的任何东西。
如果您有多个下降标签,可以在每个标签的表示层上尝试hitTest
,直到找到被触摸的标签层。
答案 1 :(得分:0)
尝试使用通常的动画块,但运行比单独的theard:
NSOperationQueue *_queue;
_queue = [[NSOperationQueue alloc] init];
SEL selector = @selector(fallWord);
NSMethodSignature *signature = [self methodSignatureForSelector:selector];
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:signature];
[inv setTarget:self];
[inv setSelector:selector];
NSInvocationOperation *fall= [[[NSInvocationOperation alloc] initWithInvocation:inv] autorelease];
[_queue addOperation:fall];
然后,实现fallWord方法,在其中设置一个下降的动画:
UILabel *lb = [[UILabel alloc] initWithFrame:CGRectMake(<#CGFloat x#>, <#CGFloat y#>, <#CGFloat width#>, <#CGFloat height#>)];
[UIView animateWithDuration:1
delay:0
options:UIViewAnimationOptionCurveLinear
animations:^{
[lb setCenter:CGPointMake(<#CGFloat x#>, <#CGFloat y#>)];
} completion:nil];
然后,你需要实现触摸和方法
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSUInteger touchCount = 0;
for (UITouch *touch in touches) {
[self dispatchFirstTouchAtPoint:[touch locationInView:self] forEvent:nil];
touchCount++;
}
}
检查UILabel框架内是否有触摸坐标
答案 2 :(得分:0)
Cocos2d结合box2d或者花栗鼠将帮助你实现降落效果(模拟屏幕底部的重力)。
我将给出Cocos2d / chipmunk的总体计划
同时学习。 Cocos2d - CCLabelTTF,CCLayer,CCSprite,CCTouch识别,如何使用cocos2d安排计时器
花栗鼠 - 身体,引力,使用cocos2d设置的计时器来逐步完成物理,调用C静态void函数来更新仍在屏幕上的CCLabelTTF,删除那些不在屏幕上的对象(过去红线),以及如何使用Cocos2d触摸方法来验证你是否触及了一个单词。 即方法
-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
Cocos2d的网站上有很棒的入门文档,而且对于chipmunk来说文档并不是很好,但是你可以找到关于挂钩的教程。
我不确定UIKit动画是否可能会被打断,以至于他们需要在你的应用中使用它们。
在任何实现中,您还需要确保显示文本的视图不大于文本。
如果你采用cocos2d +物理引擎路线来实现你的目标,你将会很好地学习如何制作一个更复杂的游戏。
答案 3 :(得分:-1)
您实际上在寻找自动完成文本框。基本上iPhone中没有这样的东西。但在UIPicker视图的帮助下,您可以提供此类效果