3

Objective-C でこの主題に関するいくつかのトピックを見てきました。私はそれらの多くを読み、解決策を見つけるために2日間費やしましたが、どれもうまくいきませんでした. 主にC#でコーディングしています。私の問題の動作(ボタンを離れる/再入力するときにのみ起動する)とコンテキスト(C#)は少し異なります。そこで、ここで質問することでチャンスをつかもうと思います。

シンプルに保つようにします。

コードのサンプルを次に示します。

private UIButton _buttonTest;

public override void ViewDidLoad ()
{
    base.ViewDidLoad ();

    _buttonTest = new UIButton(new RectangleF(10, 70, 50, 50));
    _buttonTest.SetTitle("0", UIControlState.Normal);
    _buttonTest.TouchUpInside += HandleButtonTestTouchUpInside;
    _buttonTest.BackgroundColor = UIColor.Red;
    this.View.AddSubview(_buttonTest);
}

void HandleButtonTestTouchUpInside (object sender, EventArgs e)
{
    string textNumber = _buttonTest.Title(UIControlState.Normal);

    // Increment Number
    _buttonTest.SetTitle((int.Parse(textNumber)+1).ToString(), UIControlState.Normal);
}
  • ボタンがあり、タイトル テキストが「0」に設定されています。
  • ユーザーがそれをクリックすると、番号 (タイトル) が 1 ずつ増えます。

通常、このコードは非常にうまく機能します。

ただし、いくつかの不明な理由により、一部のクラスでは機能しません...

問題は次のとおりです。

  • TouchUpInside は起動しません。...しかし、指でボタンを押したままにしてボタンを離し、ボタンを再入力してボタンを離すと、....TouchUpInsideが発生します....だからTouchUpInside を起動するには、ボタンを押したまま、指を離してボタンを再び離す必要があります。通常、このコードは非常にうまく機能します。

チェックした内容:

  • TouchUpInside を TouchDown に置き換えると、TouchDown が機能します。
  • 「User Interaction Enabled」は、すべてのスーパービューで True に設定されています。
  • すべてのビュー フレーム (スーパービュー間) は、スーパービュー フレーム内にあるようです。
  • _buttonTest を移動したところ、_buttonTest TouchUpInside が View、SuperView、SuperSuperView で正しく起動しないことに気付きました....しかし、SuperSuperSuperView では正しく起動します。

なにか提案を?

4

2 に答える 2

2

SuperSuperView では、このタップ ジェスチャが Button イベントと競合していました。

    // Tap Gesture
    UITapGestureRecognizer tapPageGestureRecognizer = new UITapGestureRecognizer();
    tapPageGestureRecognizer.AddTarget(this, new Selector ("HandleTapPageGestureRecognizer:"));         
    this.View.AddGestureRecognizer(tapPageGestureRecognizer);

アイデアは、ボタン イベント TouchDown が起動されたときにジェスチャ SuperSuperView ジェスチャを無効にし、TouchUpInside が起動されたときに再度有効にすることです。

したがって、ここに問題の1つの解決策があります:

private void SetGrandParentViewGestureEnabled(bool enabled)
{
    foreach(UIGestureRecognizer g in this.View.Superview.Superview.GestureRecognizers)
    {
        g.Enabled = enabled;
    }
}

void HandleButtonSubmitTouchDown (object sender, EventArgs e)
{
    SetGrandParentViewGestureEnabled(false);
}

void HandleButtonSubmitTouchUpInside (object sender, EventArgs e)
{
    // => Do treatments here!

    SetGrandParentViewGestureEnabled(true);
}

ただし、EventHandler または Action を使用して、タップ ジェスチャを有効/無効にすることもできました。

編集:ジェスチャを再度有効にするために追加する必要がある別の機能があります。

void HandleButtonSubmitTouchUpOutside (object sender, EventArgs e)
{
    SetGrandParentViewGestureEnabled(true);
}
于 2012-07-31T19:35:38.363 に答える
0

同様の問題がありました.TopRightButtonボタンに、このような長押し認識機能と一緒にタップ認識機能を使用することになりました。

     var longPressGesture = new UILongPressGestureRecognizer(Action);
            TopRightButton.AddGestureRecognizer(longPressGesture);

            var tapRecognizer = new UITapGestureRecognizer();

            tapRecognizer.AddTarget(() =>
                                    {
            //method
            });

            tapRecognizer.NumberOfTapsRequired = 1;

            this.TopRightButton.AddGestureRecognizer(tapRecognizer); 
private void Action(){  };
于 2013-01-24T12:54:12.687 に答える