我想创建一个动画菜单。
但问题是当我点击它时它没有响应。为什么呢?
示例代码:所有代码都在我的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;
}];
}
答案 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];
希望这会有所帮助