gpt4 book ai didi

iphone - UIGestureRecognizer 是否适用于 UIWebView?

转载 作者:IT老高 更新时间:2023-10-28 11:43:17 25 4
gpt4 key购买 nike

我试图让 UIGestureRecognizer 与 UIWebview 一起工作,它是 UIScrollView 的 subview 。这听起来很奇怪,但是当我将 numberOfTouchesRequired 设置为 2 时,选择器会触发,但是当 numberOfTouchesRequired 设置为 1 时,选择器不会触发。

这是我的代码:

UITapGestureRecognizer *tap1 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(select1:)];
tap1.numberOfTouchesRequired = 2;
tap1.numberOfTapsRequired = 1;
tap1.delegate = self;
[self.ans1WebView addGestureRecognizer:tap1];
[tap1 release];

- (void) select1:(UILongPressGestureRecognizer *)sender {
//Do Stuff
}

我已经通过使用 Apple 的 UIGestureRecognizer 示例并在他们的 nib 中插入 webview 来确认这一点。他们的点击代码在任何地方都有效,但在 web View 区域内。

最佳答案

据我所见,UIWebView 不能很好地与其他人配合使用。对于手势识别器,您可以尝试从以下位置返回 YES:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;

我必须向后兼容 3.0,所以我最终在 UIWebView 中使用 Javascript 进行所有手势处理。不是一个好的解决方案,但它满足我的需求。我能够捕捉一个元素上的长按,以及点击、滑动、捏合和旋转。当然,我只使用本地内容。

编辑:

您可以查看PhoneGap有关向 UIWebView 的委托(delegate)发送消息的示例。简而言之,您使用 document.location = "myscheme:mycommand?myarguments"然后从这个委托(delegate)回调中解析出命令和参数:

-(BOOL) webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType {
if ( [[[inRequest URL] absoluteString] hasPrefix:@"myscheme:"] ) {
//.. parse arguments
return NO;
}
}

您可以在 PhoneGap 代码中看到他们设置了一个队列和计时器来发送消息。根据您的使用情况,您可能需要执行相同的操作。关于这个主题还有其他关于 SO 的问题。

这里是 Event Handling文档。就我而言,我将事件监听器添加到 document来自 <body onload="myloader();">

function myloader() {
document.addEventListener( 'touchcancel' , touch_cancel , false );
document.addEventListener( 'touchstart' , touch_start , false );
document.addEventListener( 'touchmove' , touch_move , false );
document.addEventListener( 'touchend' , touch_end , false );
};

实际的事件处理很大程度上取决于您的需求。每个事件处理程序都会收到一个 TouchEvent带有 touches 属性,其中每个项目都是 Touch .您可以在 touchstart 处理程序中记录开始时间和位置。如果触摸移动到很远或经过错误的时间,则不是长触摸。

WebKit 可能会尝试处理长触摸来开始选择和复制。在您的事件处理程序中,您可以使用 event.preventDefault();停止默认行为。我还找到了-webkit-user-select:none css 属性对一些事情很方便。

var touch = {};
function touch_start( event /*TouchEvent*/ {
event.preventDefault();
touch = {};
touch.startX = event.touches.item(0).pageX;
touch.startY = event.touches.item(0).pageY;
touch.startT = ( new Date() ).getTime();
}

这只是我使用 javascript 的第二个项目。您可以在其他地方找到更好的示例。

如您所见,这不能快速解决您的问题。我对我得到的结果很满意。我正在使用的 html 除了一两个链接之外没有任何交互元素。

关于iphone - UIGestureRecognizer 是否适用于 UIWebView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2909807/

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