200个按钮的单个处理程序的行为不符合预期

时间:2015-04-27 05:32:11

标签: ios objective-c uigesturerecognizer

我正在创建一个按钮引擎设计,其中一个处理程序最多可以使用200个按钮。

如果我直接触摸任何按钮,处理程序将触发。目前,我只是将该按钮的alpha设置为零以隐藏它。

我也可以设置它,这样如果我滑动/拖动按钮,处理程序就会触发,并且正确的按钮alpha设置为零。

但是,如果我按下按钮,然后滑动到另一个按钮,则只处理第一个按钮触摸,只有一个按钮消失。如果我没有触及任何按钮内部,那么我可以拖动几十个按钮,它们都会消失。

我是否可以在按钮内触摸时设置一些内容,然后允许我拖动到其他按钮并让处理程序触发?

看起来touchesMoved没有被调用,直到我通过拿起我的手指释放我触摸的按钮。一旦我触摸屏幕而不在任何按钮的框架内,那么touchesMoved将被调用。是否有任何方法可以在触地后和触摸之前强制模拟释放按钮,以便touchesMoved可以在不必拿起手指的情况下再次开始调用?

以下是相关代码:

- (void) GenericButtonHandler: (UIButton *) sender {

// triggers 1 of 200 buttons if dragged through, all using this handler based on the sender.
     UIButton *btnSender;
     btnSender = (UIButton *)sender;
     btnSender.alpha = 0;
}  

GenericButton001 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[GenericButton001 addTarget: self action:@selector(GenericButtonHandler:) forControlEvents:UIControlEventTouchDown];
[self.view addSubview:GenericButton001];
[GenericButton001 setAlpha:1.0];
GenericButton001.tag = 1;

GenericButton002 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[GenericButton002 addTarget: self action:@selector(GenericButtonHandler:) forControlEvents:UIControlEventTouchDown];
[self.view addSubview:GenericButton002];
[GenericButton002 setAlpha:1.0];
GenericButton002.tag = 2;

...

我在touchesMoved中调用touchPointIsInsideAnyButton传递当前触摸点:

touchPointIsInsideAnyButton(pointToProcess);

以下是它的编码方式:

static void touchPointIsInsideAnyButton (CGPoint point){

    resetGenericButtonIndexing();

    UIButton * localButton;     

    for (int i = 1; i < 201; i++) {

        localButton = getNextGenericButton();

        if (CGRectContainsPoint(localButton.frame, point) && localButton.alpha == 1)
            [localButton sendActionsForControlEvents:UIControlEventTouchDown];
    }
} // ends touchPointIsInsideAnyButton

resetGenericButtonIndexing是一个用来保持按钮索引同步的函数。

static void  resetGenericButtonIndexing () {

    genericButtonIndex = 1;
}

以下是我如何获得下一个通用按钮:

static UIButton *  getNextGenericButton () {

    UIButton * tempButton = GenericButton001;

    switch (genericButtonIndex) {
        case 1:
            tempButton = GenericButton001;
            break;
        case 2:
            tempButton = GenericButton002;
            break;
        case 3:
            tempButton = GenericButton003;
            break;
        case 4:
            tempButton = GenericButton004;
            break;
        case 5:
            tempButton = GenericButton005;
            break;
        case 6:
            tempButton = GenericButton006;
            break;
    ....

    return tempButton;
} // ends getNextGenericButton

1 个答案:

答案 0 :(得分:0)

我担心你没有使用正确的工具来做到这一点。如何使用按钮上方的隐形视图来跟踪用户点击的位置,如果他正在拖动,丢弃等,并根据结果触发事件?

看看UIView的触摸事件API

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

找出更好的方法来做到这一点。