我有一些UIButton
个实例在UIControlEventTouchDown
和UIControlEventTouchUpInside
个事件上执行不同的代码。目前我遇到了一个问题,如果用户降落,然后在触摸之前将他们的手指拖出UIButton
的边界,TouchUpInside
代码不会运行,因此,下一个TouchDown
导致崩溃。
我需要一种方法来对此进行防错,以便在TouchDown
之后,如果手指是:a)执行TouchUpInside
代码,则执行以下操作:a)按下按钮,b)拖出按钮,或c)以其他方式取消。
a)由UIControlEventTouchUpInside
解决,我尝试了UIControlEventTouchDragExit
和UIControlEventTouchUpOutside
,但我无法解决情况b)或c)。
知道如何处理这件事吗?这是我的代码:
[newBall.button addTarget: self action: @selector(buttonDown:) forControlEvents: UIControlEventTouchDown];
[newBall.button addTarget: self action: @selector(buttonUp:) forControlEvents: UIControlEventTouchUpInside];
- (void) buttonDown: (id) sender
{
NSLog(@"Finger down on button %d!", [sender tag]);
int senderTag = [sender tag];
for (CBBall *i in balls) {
int currentTag = [i.button tag];
if (currentTag == senderTag) {
i.body -> f = cpvzero;
[i replaceDynamicBall: i withStaticOneAtLocation: cpBodyGetPos(i.body)];
[i setIsBeingTouched: YES];
}
}
}
- (void) buttonUp: (id) sender
{
NSLog(@"Finger up on button %d!", [sender tag]);
int senderTag = [sender tag];
for (CBBall *i in balls) {
int currentTag = [i.button tag];
if (currentTag == senderTag) {
[i replaceStaticBall: i withDynamicOneAtLocation: cpBodyGetPos(i.body)];
[i setIsBeingTouched: NO];
}
}
}
答案 0 :(得分:5)
设置UIControlEventAllTouchEvents
的目标,然后在目标方法中检查isTracking
UIbutton
属性的值
这将解决您的问题。
编辑:
if([btn isTracking])
{
if(flag)
{
flag=NO;
//Your TouchDown Code
}
}
else
{
flag=YES;
//your Touch Cancel and Exit code
}
并将标志设置为YES
答案 1 :(得分:0)
为您需要的所有事件设置相同的目标。
[btn addTarget:self action:@selector(yourMethodtoHandleTouchUpInside:) forControlEvents:UIControlEventTouchUpInside];
[btn addTarget:self action:@selector(yourMethodtoHandleTouchUpInside:) forControlEvents:UIControlEventTouchDragOutside];
[btn addTarget:self action:@selector(yourMethodtoHandleTouchUpInside:) forControlEvents:UIControlEventTouchUpInside];
答案 2 :(得分:0)
对于取消触摸,您可以使用UIControlEventTouchCancel。
对于b),我认为UIControlEventTouchDragExit应该可以工作,我已经尝试过它的工作,确保你已经正确连接了IBAction。
答案 3 :(得分:0)
回答你的观点
b)拖离按钮,您需要使用UIControlEventTouchDragOutside
c)以其他方式取消,您需要使用UIControlEventTouchCancel
因此:
[newBall.button addTarget:self action:@selector(someMethod:withEvent: )
forControlEvents: UIControlEventTouchCancel | UIControlEventTouchDragOutside];