Objective c 为什么触摸开始、目标操作和触摸结束的执行顺序会随着UIButton的快速触摸而改变?

Objective c 为什么触摸开始、目标操作和触摸结束的执行顺序会随着UIButton的快速触摸而改变?,objective-c,cocoa-touch,uibutton,Objective C,Cocoa Touch,Uibutton,更新:我羞愧地发现,顺序与敲击的速度无关。我在超级触控SENDED:withEvent call之前调用了可视代码,这就是为什么如果你点击得太快,显示器在再次被关闭之前就没有机会画出高亮显示的状态。因为实际上导致主线程阻塞的代码只有几毫秒,所以高亮显示的状态将一直可见,直到主线程再次解锁为止,如果你点击的速度非常快,看起来什么都没有发生。将超级调用向上移动到重写方法的顶部修复了所有问题。对不起,如果任何版主看到这篇文章,它可以被删除羞耻 这个问题一定被问了1000次,但我找不到与我的具体问题相匹

更新:我羞愧地发现,顺序与敲击的速度无关。我在超级触控SENDED:withEvent call之前调用了可视代码,这就是为什么如果你点击得太快,显示器在再次被关闭之前就没有机会画出高亮显示的状态。因为实际上导致主线程阻塞的代码只有几毫秒,所以高亮显示的状态将一直可见,直到主线程再次解锁为止,如果你点击的速度非常快,看起来什么都没有发生。将超级调用向上移动到重写方法的顶部修复了所有问题。对不起,如果任何版主看到这篇文章,它可以被删除羞耻

这个问题一定被问了1000次,但我找不到与我的具体问题相匹配的解释

我有一个自定义设计的UIButton子类。当然,设计已经足够定制,我不能只使用常规的
setSomething:forControlState:
方法。我需要一个不同的背景颜色的触摸,为一,和一些图标,需要闪光

为了实现这些视图更改,我(反直觉地)在调用各自的超级方法之前,将显示代码放在(A)
touchesbeated:withEvent
和(Z)
touchesend:withEvent:
中。感觉很奇怪,但它的工作原理与预期相符,或者说一开始看起来是这样

在实现
addTarget:action:forControlEvents
用于将
UIControlEventTouchUpInside
绑定到方法(X)
itemTapped:
之后,我希望这些方法始终按照(A)(X)(Z)的顺序激发。但是,如果你快速点击屏幕(或模拟器中的鼠标),它们会按(A)(Z)(X)的顺序发射。式中,(A)和(Z)以如此快速的顺序彼此跟随,以至于轻敲的整个视觉反馈是不可见的。这是不必要的行为。这也不是办法,因为这么多应用程序需要类似的行为,对吗

所以我的问题是:我做错了什么?我猜有一件事是按钮的视觉外观不应该在
触摸开始:withEvent
触摸结束:withEvent
中进行操作,但是在哪里呢?还是我遗漏了其他一些众所周知的事实

谢谢你的轻推,
Eric Paul。

我不知道为什么顺序不同,但这里有两条建议可以帮助解决这个问题

您对按钮进行了哪些视觉更改?如果是更改标题/图像/背景图像,则可以通过修改按钮的突出显示状态来完成所有这些操作。您可以设置一些属性,例如每个状态的标题和背景图像。当用户的手指向下按按钮时,
突出显示的
状态将打开,因此此时您对该状态所做的任何更改都将可见。请注意,如果您正在使用按钮上的
selected
状态,则您还需要设置
UIControlStateHighlighted | UIControlStateSelected
的视觉外观,否则当高亮显示和选中都打开时,它将默认返回到从正常继承


另一个建议是放弃
触摸开始:withEvent:
触摸结束:withEvent:
并切换到使用从UIControl继承的方法,即
开始使用withEvent:
结束跟踪WithTouch:withEvent:
。您可能还希望实现
continueTrackingWithTouch:withEvent:
,并在触摸离开控件时使用
touchInside
属性关闭视觉调整。

只是好奇,如果我触摸速度快了3倍,是AZXAZXAZX订单还是其他什么?AZX AZX AZX,非常可复制。虽然我认为目标动作是从[super touchesEnded:withEvent]触发的,但润色是在触发目标动作之前进行的,感谢您在开始时的提示。这是一个很好的见解。然而,正如更新中所述,这种行为的原因是我的解释错误,而不是代码错误。很抱歉呵呵,如果我只多得到65点业力,那么我就有能力删除关闭的帖子…;)这是我的+1,在10公里上:)需要关闭吗?嘿,谢谢。我想是的,但当我得到必要的业力时,我肯定会知道。@epologee如果我关闭并删除@Kevin,他会失去所有帮助你的努力。