C# 单触触地内侧不起作用,触地起作用

C# 单触触地内侧不起作用,触地起作用,c#,xamarin.ios,uibutton,xamarin,touch-up-inside,C#,Xamarin.ios,Uibutton,Xamarin,Touch Up Inside,我在Objective-C中看到了一些关于这个主题的话题。我读了很多,花了两天时间试图找到解决方案,但没有一个对我有用。我主要用C#编写代码。因为我的问题行为(仅在离开/重新进入按钮时触发)和上下文(C#)有点不同。所以,我将尝试我的机会,在这里问我的问题 我会尽量保持简单 下面是一个代码示例: private UIButton _buttonTest; public override void ViewDidLoad () { base.ViewDidLoad (); _b

我在Objective-C中看到了一些关于这个主题的话题。我读了很多,花了两天时间试图找到解决方案,但没有一个对我有用。我主要用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
这段代码通常工作得很好

然而,由于一些未知的原因,它在我的一些课程中不起作用

问题是:

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);
}
  • 触碰内部不会开火。。。但是,如果我用手指按住按钮,并在离开按钮时一直按住手指,然后重新进入按钮,然后松开按钮,然后。。。。它将在内部触发触地。。。。因此,手指需要离开并重新租用按钮,同时按住按钮,以使触碰内部起火。通常,这段代码工作得很好
检查事项:

  • 如果我用触地得分代替触地得分,那么触地得分就起作用了
  • 对于所有SuperView,“已启用用户交互”设置为True
  • 所有视图框架(在超级视图中)似乎都在其超级视图框架内
  • 我移动了一下按钮测试,我注意到在视图、超级视图、超级超级视图中,按钮测试触控按钮内部没有正确触发。。。。但它在SuperSuperView中正确启动

有什么建议吗?

在SuperSuperView中,我有一个与按钮事件冲突的点击手势

    // Tap Gesture
    UITapGestureRecognizer tapPageGestureRecognizer = new UITapGestureRecognizer();
    tapPageGestureRecognizer.AddTarget(this, new Selector ("HandleTapPageGestureRecognizer:"));         
    this.View.AddGestureRecognizer(tapPageGestureRecognizer);
其想法是在触发按钮事件、触地时禁用手势SuperSuperView手势。。。并在触发TouchUpInside时重新启用它

因此,这里有一个解决问题的方法:

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);
}

我有一个类似的问题,我最终使用了一个点击识别器和长按识别器,像这样用于按钮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(){  };

你试过Monotouch社区寻求帮助吗?也许你错过了一个技巧,或者只是使用了错误的事件。您使用
toucupinside
这一事实表明事件将在
toucupinside
着陆后发生。您是否知道这一点尚不清楚。我使用
toucupinside
进行所有按钮点击(因此这是正确的方法),并且没有您提到的问题。在你的按钮上方有其他视图会阻止它被点击吗?我还没有尝试Monotouch社区,但也许我很快就会尝试。我希望我错过了一个技巧,但我认为我使用了正确的项目。是的,我知道触地得分后会出现触地得分事件。我也经常使用触地得分,但这是我第一次遇到这种问题。。。我会检查我的按钮顶部是否有其他视图阻止它被点击……好的,我想我发现了问题。。。按钮和我在SuperSuperView中声明的点击手势之间存在冲突。因此,由于点击手势是在祖父视图上触发的,因此它似乎取消了按钮内部的触碰。我会努力找到一个优雅的解决方案。。。否则。。。我必须在接地时禁用轻触手势。。。然后重新启用触碰内侧的手势。谢谢!我很高兴我偶然发现了这一点。对我来说,它在iOS6中工作,但在ios5中不工作。顺便说一句,lambdas可以使代码更清晰。e、 g.:myButton.TouchDown+=(对象发送者,事件参数e)=>My手势。Enabled=false;