Objective c 目标C:(怪异)UIButton框架记录不同的坐标和显示位置(并接收触摸)

Objective c 目标C:(怪异)UIButton框架记录不同的坐标和显示位置(并接收触摸),objective-c,ios,ios5,uiview,uibutton,Objective C,Ios,Ios5,Uiview,Uibutton,更新的解决方案:主要问题是,我的速度计算返回一个整数-0,除了索引3处的对象,它是1——尽管被标记为实例化为浮点。结果如何?按钮处于从原点到目标的“无限”动画(速度为0的动画)中 //////////////////////////////////////// 奇怪:我正在以编程方式在视图上绘制一些按钮,在对代码进行故障排除时,我发现按钮的框架/位置/中心(位置A)与实际显示的位置(位置B)不同。这是我第一次遇到这种现象 (更糟糕的是,我使用了hitTest:withEvent:并根据按钮的帧返

更新的解决方案:主要问题是,我的速度计算返回一个整数-
0
,除了索引3处的对象,它是
1
——尽管被标记为实例化为
浮点
。结果如何?按钮处于从原点到目标的“无限”动画(速度为0的动画)中

////////////////////////////////////////

奇怪:我正在以编程方式在视图上绘制一些按钮,在对代码进行故障排除时,我发现按钮的框架/位置/中心(位置A)与实际显示的位置(位置B)不同。这是我第一次遇到这种现象

(更糟糕的是,我使用了
hitTest:withEvent:
并根据按钮的帧返回按钮,因此我实际上是在跟踪触摸位置A时的点击(和触发动作),即使按钮本身显示在位置B中。)

注意事项和注意事项:其中一个按钮显示正确。我不知道为什么。所有按钮都会正确设置动画,因为动画会从其帧中运行

我确信我的代码中遗漏了一些东西,但我已经检查了好几个小时了,如果框架报告错误,我需要更多的眼睛

图表:

+-----------------------+
|(mainV)                |
|                       |
|                 +----+|
|                 |(sB)||
|                 +----+|
|                 +----+|
|                 |(sB)||
|                 +----+|
|                 +----+|
|                 |(sB)||
|                 +----+|
|                 +----+|
|                 |(sB)||
|                 +----+|
|                 +----+|
|                 |(dW)||
|                 +----+|
|+---------------------+|
||(mV)                 ||
|+---------------------+|
+-----------------------+
图例:

+-----------------------+
|(mainV)                |
|                       |
|                 +----+|
|                 |(sB)||
|                 +----+|
|                 +----+|
|                 |(sB)||
|                 +----+|
|                 +----+|
|                 |(sB)||
|                 +----+|
|                 +----+|
|                 |(sB)||
|                 +----+|
|                 +----+|
|                 |(dW)||
|                 +----+|
|+---------------------+|
||(mV)                 ||
|+---------------------+|
+-----------------------+
  • (mainV)=主视图/视图控制器,所有内容的父视图
  • (mV)=菜单视图,主视图的子视图
  • (dW)=drawButton,(mV)的子视图,以及构建其他按钮的“锚定”
  • (sB)=sizeButton的实例,mV的子视图,使用
    hitTest:withEvent:
    在superview的框架外进行触摸
代码和注释:

+-----------------------+
|(mainV)                |
|                       |
|                 +----+|
|                 |(sB)||
|                 +----+|
|                 +----+|
|                 |(sB)||
|                 +----+|
|                 +----+|
|                 |(sB)||
|                 +----+|
|                 +----+|
|                 |(sB)||
|                 +----+|
|                 +----+|
|                 |(dW)||
|                 +----+|
|+---------------------+|
||(mV)                 ||
|+---------------------+|
+-----------------------+
中心按钮创建方法,我最初调用并创建按钮,大多数变量都是实例变量

动画辅助方法


如果禁用动画,是否仍会出现此问题

是否将变换应用于任何视图


我要注意的一点是:设置UIView的框架,然后调整其层的位置是很奇怪的。使用
[sizeButton setCenter:position]
而不是访问层怎么样。我认为这不是问题所在,但可能与此有关。同样,为什么不使用UIView的动画方法,而不是潜入卡巴斯基化的土地?

啊,天哪!当然,鉴于问题,禁用动画是一个明显的故障排除步骤。这确实允许按钮正确显示-现在来了解实际发生了什么…)p、 美国明确尝试了
setCenter:
但没有成功-每种方法的优缺点是什么?p、 s.s.感觉有点傻,但我没意识到UIView有自己的动画。。现在进一步阅读。一般来说,我尝试对Apple的UIView子类使用UIView级别的方法,因为如果您直接操作它们的层,您偶尔会遇到麻烦。如果您尝试UIView动画方法和setCenter:但仍然遇到问题,请发布更新的代码,我很乐意看一看。啊,那么我的
速度
计算(或者更确切地说是它的类型)的问题就来了。仍然在我的实现中拨号,但查看动画是正确的故障排除路径,因此标记您的建议作为答案。谢谢你,杰西!下一个项目,或者下一次遇到障碍时,我将重点关注UIView的动画内容。
- (CABasicAnimation *)slideButton:(UIButton *)button
                        fromPoint:(CGPoint)origin
                          toPoint:(CGPoint)destination
                          atSpeed:(float)speed{

    // now show animation
    CABasicAnimation *slideAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
    [slideAnimation setDelegate:self];

    // from & to values
    [slideAnimation setFromValue:[NSValue valueWithCGPoint:origin]];
    [slideAnimation setToValue:[NSValue valueWithCGPoint:destination]];

    // easing in and out.. oh yeah!
    [slideAnimation setDuration:kAnimationTiming / speed];
    CAMediaTimingFunction *easeInOut = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    [slideAnimation setTimingFunction:easeInOut];

    NSLog(@"slide animation from %@ to %@",NSStringFromCGPoint(origin),NSStringFromCGPoint(destination));

    // NSLog Output: (all these values are correct/what I intended)
    // AND recall that all animations display properly!
    // in fact, judging by NSLog, everything is working fine.. but visually it is not
    // slide animation from {287.8, -24.25} to {287.8, -66.6} (for button atIndex:0)
    // slide animation from {287.8, -24.25} to {287.8, -105.1} (for button atIndex:1)
    // slide animation from {287.8, -24.25} to {287.8, -143.6} (for button atIndex:2)
    // slide animation from {287.8, -24.25} to {287.8, -182.1} (for button atIndex:3)

    return slideAnimation;
}