如何解决UIScreenEdgePanGestureRecognizer 在第一个 No 后从 ShouldBegin 停止工作
我有 UIScreenEdgePanGestureRecognizer
和自定义委托来决定是否应该开始手势。在 gestureRecognizerShouldBegin
返回 No
之前一切正常。之后委托继续被调用 gestureRecognizerShouldBegin
但手势不会独立于结果开始。
我尝试调用 reset()
并删除并重新向视图添加手势识别器,但它不起作用。
我真的不知道如何进行,非常感谢任何指示。
附言我发现聚焦 UITextView
会导致 - 在聚焦和不聚焦后 UITextView
手势停止工作。但我仍然不知道根本原因是什么。
我制作了一个简单的重现应用:https://drive.google.com/file/d/1IYPDdKILBxFCrjV3-RjrnerXPoWT0RQJ/view?usp=sharing
这是代码示例:
public class ContentPageRenderer : PageRenderer
{
public override void ViewDidLoad()
{
base.ViewDidLoad();
var pan = new UIScreenEdgePanGestureRecognizer(HandlePan)
{
Edges = UIRectEdge.Left,Delegate = new InteractivePopGestureDelegate()
};
View.AddGestureRecognizer(pan);
}
private void HandlePan(UIScreenEdgePanGestureRecognizer recognizer)
{
Console.WriteLine($"HandlePan: {recognizer.State}"); // This stop being called after focusing Editor on page.
}
private class InteractivePopGestureDelegate : UIGestureRecognizerDelegate
{
public override bool ShouldBegin(UIGestureRecognizer recognizer)
{
Console.WriteLine("ShouldBegin"); // This gets called as expected.
return true;
}
}
}
谢谢!
解决方法
我不确定为什么共享代码不起作用,但我知道将 AddTarget
用于 UIScreenEdgePanGestureRecognizer 可以使它起作用。你可以试试。
示例代码:
public class ModalPageRenderer : PageRenderer
{
public override void ViewDidLoad()
{
base.ViewDidLoad();
var pan = new UIScreenEdgePanGestureRecognizer();
pan.Edges = UIRectEdge.Left;
pan.AddTarget(() => HandlePan(pan));
View.AddGestureRecognizer(pan);
}
private void HandlePan(UIScreenEdgePanGestureRecognizer recognizer)
{
Console.WriteLine($"HandlePan: {recognizer.State}"); // This stop being called after focusing Editor on page.
if(recognizer.State == UIGestureRecognizerState.Began)
{
Console.WriteLine("ShouldBegin");
}
#region Just to make something happen on the UI
// Following lines could be totally ignored / removed.
// Just to make it visible on the UI.
Color fadeColor = Color.FromRgb(122,85,191);
nfloat Fade(double component,nfloat opacity) => (nfloat) (1d - opacity * (1d - component));
var point = recognizer.LocationInView(recognizer.View);
if (recognizer.State == UIGestureRecognizerState.Changed)
{
var opacity = point.X / recognizer.View.Frame.Width;
recognizer.View.BackgroundColor =
UIColor.FromRGB(
Fade(fadeColor.R,opacity),Fade(fadeColor.G,Fade(fadeColor.B,opacity));
}
else if (recognizer.State == UIGestureRecognizerState.Ended ||
recognizer.State == UIGestureRecognizerState.Cancelled)
{
recognizer.View.BackgroundColor = UIColor.White;
}
#endregion
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。