gpt4 book ai didi

objective-c - 未调用带有 touchesMoved 的 UIScrollView

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:49:10 26 4
gpt4 key购买 nike

我有一个包含 UIImageView 的 UIScrollView。UIScrollView 允许通过 UIImageView 进行缩放和平移。

问题是我每次都想知道手指的移动,我正试图用 touchesMoved 方法捕捉事件。但它不起作用,尽管已正确调用 touchesBegan 和 touchesEnded。

事实上,如果手指移动非常小,并且 UIScrollView 没有开始平移,则会调用 touchesMoved。在 UIScrollView 开始移动的那一刻,事件停止被调用。

有人知道问题是什么以及如何解决吗?我想也许里面的 UIImageView 正在捕获事件或类似的东西。

最佳答案

实际上,这确实是个大问题,因为 UIScrollView 确实TouchesMoved 事件(即使传播了几个第一个事件)。

所以,我想出了直接从 UIWindow 获取事件的方法。这肯定不是应用程序结构意义上的最佳方法,但在某些自定义情况下(这正是我所需要的)是好的。

(示例在 MonoTouch C# 中)。

创建您的自定义 UIWindow(由于我的自定义逻辑(使用 MvvmCross 框架),我没有在这里展示如何用 MyWindow 替换标准 UIWindow,但这非常简单,通常在 appDelegate 初始化逻辑中完成- 你会在 google/stack overflow 中找到它):

public class MyWindow : UIWindow
{
public MyWindow(RectangleF bounds) : base(bounds)
{

}

public override void SendEvent(UIEvent evt)
{
if (evt.Type == UIEventType.Touches) {
var el = (UITouch)evt.AllTouches.AnyObject;

if (el.Phase == UITouchPhase.Began)
{
if(OnTouchBegan != null)
OnTouchBegan(el.View, new TouchCommandArgs(evt.AllTouches, evt));
}

if (el.Phase == UITouchPhase.Moved)
{
if(OnTouchMoved != null)
OnTouchMoved(el.View, new TouchCommandArgs(evt.AllTouches, evt));
}

if (el.Phase == UITouchPhase.Ended)
{
if(OnTouchEnd != null)
OnTouchEnd(el.View, new TouchCommandArgs(evt.AllTouches, evt));
}

if (el.Phase == UITouchPhase.Cancelled)
{
if(OnTouchCancel != null)
OnTouchCancel(el.View, new TouchCommandArgs(evt.AllTouches, evt));
}

} else
MvxTrace.Trace (evt.Type == null ? "-" : evt.ToString ());
base.SendEvent(evt);
}

public event TouchCommand OnTouchBegan;
public event TouchCommand OnTouchEnd;
public event TouchCommand OnTouchCancel;
public event TouchCommand OnTouchMoved;

}

public class TouchCommandArgs : EventArgs
{
public NSSet Touches { get; set; }
public UIEvent Evt { get; set; }

public TouchCommandArgs(NSSet touches, UIEvent evt)
{
Touches = touches;
Evt = evt;
}
}

并在处理事件的地方订阅自定义事件处理程序:

var window = (MyWindow) UIApplication.SharedApplication.KeyWindow;
window.OnTouchBegan += view_OnTouchBegan;
window.OnTouchMoved += view_OnTouchMoved;
window.OnTouchCancel += view_OnTouchCancel;
window.OnTouchEnd += view_OnTouchEnd;

handlers like (that's all by your own):

void view_OnTouchBegan(object sender, TouchCommandArgs args)
{
// do your logic
}

在那种情况下,事件将同时处理(在两个地方:你的和 UIScrollView),所以如果你愿意,你可以取消窗口的事件传播只有当你想阻止除你的处理程序之外的任何其他处理程序应用时(你例如,可以向您的处理程序添加“已处理”标志。

关于objective-c - 未调用带有 touchesMoved 的 UIScrollView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12259005/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com