3

たとえば、UIButtonIBに配置したものがあります。

これUIButtonには、内側にタッチアップするか外側にドラッグするかに応じて2つの機能があります。少なくとも、内側にタッチアップするために機能し続けると便利です。

ボタンをクリックして「外側にドラッグ」したいのですが、-touchesEnded最後にクリックを離すときに長方形の上で使用します。

1つのオプションは、マスクを捨ててUIButton使用-touchesBeganすることですが、それははるかに手間がかかり、(96個のボタンを考慮して)かなり大きな書き直しが必要です。

-touchesEndedつまり、少し言い換えると、ボタンをクリックしてマウスを押したまま、カーソル(/指)をビューの別のポイントにドラッグし、最後に離したときにビューに認識させたいと思います。問題は、最初のクリックがボタンに固定されているため-touchesEnded、メインビューでは発生しないことです...

私はこれを間違った方法でやろうとしていますか?また、私は明確ですか?

編集:@Heckmanは質問をかなり下に表現しました

4

4 に答える 4

2

私があなたの質問を正しく理解している場合、あなたはいくつかのUIViewに含まれている1つのボタンに触れており、指をドラッグして外に出し、ボタンのスーパービューでポイントを認識できるようにしたいと考えています。

ボタンからボタンが押されたことを検出し、を呼び出して、[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 に答える