IOS - 动画没响应

时间:2012-03-22 15:19:25

标签: objective-c ios animation uiview

我想创建一个动画菜单。

  • 首先隐藏在屏幕外
  • 当用户点击屏幕时,它将滑入
  • 用户可以点按它并执行某些操作
  • 然后在3秒后它会滑到屏幕外

但问题是当我点击它时它没有响应。为什么呢?

示例代码:所有代码都在我的UIView类中。

showing = NO;
box = [[UIView alloc] initWithFrame:CGRectMake(500,-200,200,200)];
box.backgroundColor = [UIColor redColor];

UITapGestureRecognizer *tapBox = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapMenuHandler:)] autorelease];
[box addGestureRecognizer:tapBox];

[self addSubView:box];

-(void) tapMenuHandler: (UIView *)obj {
    //Do something
    NSLog(@"tap box");
} 

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
if (!showing) {

    box.frame = CGRectMake(500, -200, 200, 200);

    [UIView animateWithDuration:0.5f delay:0.3f options:(UIViewAnimationOptionAllowUserInteraction) animations:^{

        box.frame = CGRectMake(500, 200, 200, 200);

    } completion:^(BOOL finished) {
        showing = YES;

                    [UIView animateWithDuration:0.5f delay:3.0f options:(UIViewAnimationOptionAllowUserInteraction) animations:^{
                        box.frame = CGRectMake(500, -200, 200,200);
                    } completion:^(BOOL finished) {
                       showing = NO;
                    }];

    }];    
}

}

感谢您的帮助,对不起我的英语:)

编辑:更详细 我尝试在屏幕上设置启动我的盒子的原点(例如500,600),即使我的盒子移动到另一个位置,它仍然总是在开始点(500,600)时点击响应。

更新: 我改变了方法,使用NSTimer将屏幕移到屏幕外,然后就可以了!

[UIView animateWithDuration:0.5f delay:0.3f options:UIViewAnimationOptionAllowUserInteraction animations:^{

        box.frame = CGRectMake(500,200,200,200);

    } completion:^(BOOL finished) {
        isShowMenubar = YES;
        //use NSTimer instead of delay
        [NSTimer scheduledTimerWithTimeInterval:3.0f target:self selector:@selector(hideBox) userInfo:nil repeats:NO];

    }]; 

-(void)hideBox {
[UIView animateWithDuration:0.5f delay:0.0f options:UIViewAnimationOptionAllowUserInteraction animations:^{
    box.frame = CGRectMake(500,-200,200,200);} completion:^(BOOL finished) {
        isShowMenubar = NO;
    }];
}

2 个答案:

答案 0 :(得分:3)

盒子没有接收触摸的原因与动画的工作方式有关。你的盒子实际上是在屏幕外,但在视觉上,它正在通过动画。

即使您将延迟设置为3.0,它仍会预先移动框(由于仍在调用动画方法)。因此,在您当前的代码中,如果您点击(500,-200)处的框,则会接收到触摸。

要解决此问题,请使用NSTimer或Grand Central Dispatch延迟。

的NSTimer:

[NSTimer scheduledTimerWithTimeInterval:3.0 target:self action:@selector(dismissBox) userInfo:nil repeats:NO];

NSTimer的问题在于你必须将动画代码放在一个单独的方法中。

Grand Central Dispatch:

double delayInSeconds = 3.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    [UIView animateWithDuration:0.5f animations:^{
        box.frame = CGRectMake(box.frame.origin.x, -200, 200,200);

    }completion:^(BOOL finished) {
        showing = NO;
    }];
});

答案 1 :(得分:0)

我运行了代码并且没有看到红色视图。然后玩了一下,我得到了你的视图是动画但仍然超出范围所以你永远不会看到它。尝试将动画块更改为(框架的原点位于左下角)

box.frame = CGRectMake(100, 100, 200, 200);

希望它能够动起来。

另外,假设您在视图控制器中运行它们,正确的方法应该是

[self.view addSubview:box];

希望这会有所帮助