动画期间用于UIButton的CGRectContainsPoint

时间:2013-11-27 16:26:31

标签: ios objective-c animation uibutton

我正在创建一个遵循UITouch点的UIButton,我希望当我继续按下触摸并且动画边界到达我的触摸点时,我会在那里执行一些活动。

以下是代码。

对于UIButton,我总是得到x,y 0。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [UIView beginAnimations:@"MoveAndStrech" context:nil];
    [UIView setAnimationDuration:1];
    [UIView setAnimationBeginsFromCurrentState:YES];

    if([touches count] == 1) {
        UITouch *touch = [touches anyObject];
        self.uiButton.center = [touch locationInView:self.view];
    }
    [UIView commitAnimations];

    UITouch *touchTemp = [touches anyObject];
    CGPoint pCurrent = [touchTemp locationInView:self.view];
    CGRect currentRect = self.uiButton.layer.bounds;

    NSLog(@"Current Rect x:%f,Current y:%f",
          currentRect.origin.x,
          currentRect.origin.y);
    NSLog(@"TouchPoint x:%f,TouchPoint y:%f",
          pCurrent.x,
          pCurrent.y);

    if(CGRectContainsPoint(currentRect, pCurrent)) {
        NSLog(@"Touched....in rect");
    }
}

此致 萨拉

2 个答案:

答案 0 :(得分:0)

替换

CGRect currentRect = self.uiButton.layer.bounds;

CGRect currentRect = self.uiButton.frame;

如果这不起作用,那么

CGRect currentRect = self.uiButton.presentationLayer.frame;

另外,为什么你不使用UIView动画块?它会让您的生活更轻松,代码更清晰。

答案 1 :(得分:0)

有几件事。起初我以为你错过了对commitAnimations的调用。

不要在同一行上放置多个语句!!!! 这是一个非常讨厌的编码习惯,使您的代码几乎无法读取。

接下来,旧样式beginAnimations / commitAnimations调用已过时,不应在iOS 4或更高版本中使用。引用beginAnimations的文档:context:

  

在iOS 4.0及更高版本中不鼓励使用此方法。你应该用   基于块的动画方法来指定你的动画。

你应该使用新的基于块的动画调用(形式为(animateWithDuration:animations :))

接下来,UIView动画会使动画对象立即移动到它的最终位置。他们只是看起来随着时间的推移他们正在移动到他们的最终位置。默认情况下,它们还会在动画期间禁用用户交互。

如果您想在任何给定时刻确定视图在屏幕上的显示位置,那么您需要检查视图的图层的animationLayer。我有一个sample project on Github(链接),其中包含一个图像的UIView动画,您可以在其中点按图像并停止动画。此示例项目显示了如何使用视图图层的动画层来确定用户点击屏幕时动画的位置。

如果您希望代码在动画视图达到某个点时执行某些操作,则会更棘手。您可能需要将CADisplayLink附加到视图(将在每次屏幕刷新时调用)并使用它来检查动画的位置并将其与当前触摸位置进行比较。