动画期间 UIButton 的 CGRectContainsPoint

Posted

技术标签:

【中文标题】动画期间 UIButton 的 CGRectContainsPoint【英文标题】:CGRectContainsPoint for a UIButton during animation 【发布时间】:2013-11-27 16:26:30 【问题描述】:

我正在创建一个跟随 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");
    

问候 萨拉

【问题讨论】:

【参考方案1】:

替换

CGRect currentRect = self.uiButton.layer.bounds;

CGRect currentRect = self.uiButton.frame;

如果这不起作用,那么

CGRect currentRect = self.uiButton.presentationLayer.frame;

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

【讨论】:

如果我使用 self.uiButton.frame;如果我使用 CGRect currentRect = self.uiButton.presentationLayer.frame,它就像我一点击它就会给我一个 CGRectContainsPoint 为真;它给了我一个找不到属性的错误 所以使用layer.presentationLayer。去研究一下,伙计。【参考方案2】:

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

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

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

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

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

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

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

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

【讨论】:

检查了样本,它确实告诉了事情,但仍然有任何替代的快速的,这样当视图到达接触点时它会发送一个信号!或者可以向我推荐一些我从动画块开始的东西,并了解我该如何完成!

以上是关于动画期间 UIButton 的 CGRectContainsPoint的主要内容,如果未能解决你的问题,请参考以下文章

动画期间未调用 UIButton 的选择器方法

在 CABasicAnimation 期间 UIButton 未显示选定状态

在动画期间访问 UIView 的当前位置

iOS:动画期间未调用 IBAction

如何在 UITableView 重新加载期间控制过渡动画? [复制]

UIButtons 不会在动画块期间淡出