3

例如,我有一个UIButton放在 IB 中的。

UIButton有两个功能,具体取决于它是只是在内部修饰还是拖到外部 - 至少保持它在内部修饰的功能会很好。

我想点击我的按钮并“拖到外面”,但是-touchesEnded当我最终释放我的点击时,我会在一个矩形上使用。

我知道一种选择是放弃UIButton并使用-touchesBegan遮罩,但这需要付出更多的努力,并且需要进行很大的重写(考虑到 96 个按钮)。

所以稍微改一下 - 我点击了一个按钮并按住鼠标,同时将光标(/finger)拖动到我视图中的不同点,我希望我的视图-touchesEnded在我最终放手时能够识别a。问题是初始点击被绑定在按钮中,所以-touchesEnded在我的主视图中不会发生......

我试图以错误的方式做到这一点吗?另外,我说清楚了吗?

编辑:@Heckman 在下面很好地表达了这个问题

4

4 回答 4

2

如果我正确理解您的问题,您正在触摸一个按钮,该按钮包含在某个 UIView 中,并且希望能够将您的手指拖出并识别按钮超级视图中的点。

在我看来,您应该从按钮检测按钮按下,然后调用[UIButton superview], 告诉超级视图有关按下按钮的开始,然后在视图中处理触摸结束。

要通知按下的按钮的超级视图,请调用类似(来自您的 UIButton):

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.superview buttonPressed:self]
}
-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.superview touchesEnded:touches withEvent:event];
}

在您的超级视图代码中(如果您有属性 buttonPressed):

-(void) buttonPressed:(UIButton *) button {
    _buttonPressed = button;
}
-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    if(self.buttonPressed) {
         //Process the release from your drag here. 
         for(UITouch * touch in touches) {
         //Use either of these to get the release position that you care about.
             CGPoint releaseLocationInCurrentView = [touch locationInView:self];
             CGPoint releaseLocationInButtonView = [touch locationInView:[self.buttonPressed]];
         }
    }
}
于 2012-05-15T00:59:39.280 回答
1

您也许可以在您的 UIView 上使用UIPanGestureRecognizer 。

下面是一些关于如何实现手势识别器的示例代码。

于 2012-05-15T00:30:51.333 回答
0

如果您正在寻找与 iphone 主屏幕图标相同的可拖动项目,那么您可以查看 Three20 框架中的 TTLauncherView 示例。http://three20.info/showcase/launcher

于 2012-05-15T05:59:54.043 回答
-1

所以,这就是我最终做的事情,而且效果很好:

我在 touchdragexit 上的 UIButton 被分配给 IBAction

-(IBAction)dragPoint:(id)sender {

//Do Something Useful in here - I assign the value to an Array that I can recall when I touch up inside one of 16 buttons

//Now pass the button touch on as a touch up outside

[myButton addTarget:self action:@selector(dragBegan:withEvent:) forControlEvents: UIControlEventTouchUpOutside];
}

所以现在我像这样得到我的dragBegan:

- (void)dragBegan:(UIControl *)c withEvent:ev {

UITouch *touch = [[ev allTouches] anyObject];
CGPoint touchPoint = [touch locationInView:self.view]; // Get location of the moment I release the touch (touch up outside)

//now some long convoluted code to give me the location of a row of 16 buttons, of which I would like to know which one I touched up inside

UIButton *posButton;
int pos;

if(628.00<(touchPoint.y) && (touchPoint.y)<664.00){
    if ((39.00<touchPoint.x && touchPoint.x<91.00) || (92.00<touchPoint.x && touchPoint.x<144.00) || (145.00<touchPoint.x && touchPoint.x<197.00) || (198.00<touchPoint.x && touchPoint.x<250.00)||(264.00<(touchPoint.x) && touchPoint.x<314.00)||(317.00<(touchPoint.x) && touchPoint.x<367.00)||(370.00<(touchPoint.x) && touchPoint.x<420.00)||(423.00<(touchPoint.x) && touchPoint.x<473.00)||(488.00<(touchPoint.x) && touchPoint.x<538.00) || (541.00<(touchPoint.x) && touchPoint.x<591.00) || (594.00<(touchPoint.x) && touchPoint.x<644.00) || (647.00<(touchPoint.x) && touchPoint.x<697.00)||(712.00<(touchPoint.x) && touchPoint.x<762.00)||(765.00<(touchPoint.x) && touchPoint.x<815.00)||(818.00<(touchPoint.x) && touchPoint.x<868.00)||(871.00<(touchPoint.x) && touchPoint.x<921.00)){


    if(39.00<(touchPoint.x) && touchPoint.x<91.00){
        posButton = SeqA;
        pos=0;

    }
    else if(92.00<(touchPoint.x) && touchPoint.x<144.00){
        posButton = SeqB;
        pos=1;

    }
    else if(145.00<(touchPoint.x) && touchPoint.x<197.00){
        posButton = SeqC;
        pos=2;

    }
    else if(198.00<(touchPoint.x) && touchPoint.x<250.00){
        posButton = SeqD;
        pos=3;

    }
        else if(264.00<(touchPoint.x) && touchPoint.x<314.00){
            posButton = SeqE;
            pos=4;

        }
        else if(317.00<(touchPoint.x) && touchPoint.x<367.00){
            posButton = SeqF;
            pos=5;

        }
        else if(370.00<(touchPoint.x) && touchPoint.x<420.00){
            posButton = SeqG;
            pos=6;

        }
        else if(423.00<(touchPoint.x) && touchPoint.x<473.00){
            posButton = SeqH;
            pos=7;

        }






        else if(488.00<(touchPoint.x) && touchPoint.x<538.00){
            posButton = SeqI;
            pos=8;

        }
        else if(541.00<(touchPoint.x) && touchPoint.x<591.00){
            posButton = SeqJ;
            pos=9;

        }
        else if(594.00<(touchPoint.x) && touchPoint.x<644.00){
            posButton = SeqK;
            pos=10;

        }
        else if(647.00<(touchPoint.x) && touchPoint.x<697.00){
            posButton = SeqL;
            pos=11;

        }

        else if(712.00<(touchPoint.x) && touchPoint.x<762.00){
            posButton = SeqM;
            pos=12;

        }
        else if(765.00<(touchPoint.x) && touchPoint.x<815.00){
            posButton = SeqN;
            pos=13;

        }
        else if(818.00<(touchPoint.x) && touchPoint.x<868.00){
            posButton = SeqO;
            pos=14;

        }
        else if(871.00<(touchPoint.x) && touchPoint.x<921.00){
            posButton = SeqP;
            pos=15;

        }

现在根据你在里面触摸的按钮做一些事情

我做的其他事情 - 我创建了一个原始 UIButton 的掩码作为 UIImageView 我在 touchdragoutside 事件中取消隐藏(并在上面的 touchupinside 上重新出价)所以我有一个可以拖动的按钮

于 2012-05-23T16:02:11.870 回答