从iphone屏幕顶部落下的字

时间:2011-11-22 05:38:03

标签: iphone objective-c

我正在开发一个单词查找应用程序。我想要从iPhone的屏幕顶部掉下一些单词。

屏幕底部会有一条红线。

用户必须在到达红线前选择正确的单词。

那么如何在iphone中实现下降效果(即单词效果)。

任何人都可以帮助我。

提前致谢。

4 个答案:

答案 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视图的帮助下,您可以提供此类效果