博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Observing pinch multi-touch gestures in a UITableView
阅读量:6306 次
发布时间:2019-06-22

本文共 5427 字,大约阅读时间需要 18 分钟。

I am looking to implement a pinch in/out on top of a UITableView, I have looked at several methods including this one:

 

But while I can create a UIViewTouch object and overlay it onto my UITableView, scroll events are not being relayed to my UITableView, I can still select cells, and they respond properly by triggering a transition to a new ViewController object. But I can not scroll the UITableView despite passing the touchesBegan, touchesMoved, and touchesEnded events.

 

answer:

This seems to be a classic problem. In my case I wanted to intercept some events over a UIWebView which can't be subclassed, etc etc.

I've found that the best way to do it is to intercept the events using the UIWindow:

EventInterceptWindow.h

@protocol EventInterceptWindowDelegate- (BOOL)interceptEvent:(UIEvent *)event; // return YES if event handled@end@interface EventInterceptWindow : UIWindow {    // It would appear that using the variable name 'delegate' in any UI Kit    // subclass is a really bad idea because it can occlude the same name in a    // superclass and silently break things like autorotation.    id 
eventInterceptDelegate;}@property(nonatomic, assign) id
eventInterceptDelegate;@end

EventInterceptWindow.m:

#import "EventInterceptWindow.h"@implementation EventInterceptWindow@synthesize eventInterceptDelegate;- (void)sendEvent:(UIEvent *)event {    if ([eventInterceptDelegate interceptEvent:event] == NO)        [super sendEvent:event];}@end

Create that class, change the class of your UIWindow in your MainWindow.xib to EventInterceptWindow, then somewhere set the eventInterceptDelegate to a view controller that you want to intercept events. Example that intercepts a double-tap:

- (BOOL)interceptEvent:(UIEvent *)event {    NSSet *touches = [event allTouches];    UITouch *oneTouch = [touches anyObject];    UIView *touchView = [oneTouch view];    //  NSLog(@"tap count = %d", [oneTouch tapCount]);    // check for taps on the web view which really end up being dispatched to    // a scroll view    if (touchView && [touchView isDescendantOfView:webView]            && touches && oneTouch.phase == UITouchPhaseBegan) {        if ([oneTouch tapCount] == 2) {            [self toggleScreenDecorations];            return YES;        }    }       return NO;}

Related info here: 

 

 

 

another:

 

#import 
#import "EventInterceptWindow.h"@interface ViewController : UIViewController
{ int initialDistance;}- (BOOL) interceptEvent:(UIEvent *) event;@end

 

- (void) viewDidAppear:(BOOL)animated{    [super viewDidAppear:animated];    // Register to receive touch events    AppDelegate *appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];    EventInterceptWindow *window = (EventInterceptWindow *) appDelegate.window;    window.eventInterceptDelegate = self;}- (void) viewWillDisappear:(BOOL) animated{    // Deregister from receiving touch events    AppDelegate *appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];    EventInterceptWindow *window = (EventInterceptWindow *) appDelegate.window;    window.eventInterceptDelegate = nil;    [super viewWillDisappear:animated];}- (BOOL) interceptEvent:(UIEvent *) event{    NSSet *touches = [event allTouches];        // Give up if user wasn't using two fingers    if([touches count] != 2) return NO;        UITouchPhase phase = ((UITouch *) [touches anyObject]).phase;    CGPoint firstPoint = [[[touches allObjects] objectAtIndex:0] locationInView:self.view];    CGPoint secondPoint = [[[touches allObjects] objectAtIndex:1] locationInView:self.view];        CGFloat deltaX = secondPoint.x - firstPoint.x;    CGFloat deltaY = secondPoint.y - firstPoint.y;    CGFloat distance = sqrt(deltaX*deltaX + deltaY*deltaY);        if(phase == UITouchPhaseBegan)    {        initialDistance = distance;    }    else if(phase == UITouchPhaseMoved)    {        CGFloat currentDistance = distance;        if(initialDistance == 0) initialDistance = currentDistance;        else if(currentDistance - initialDistance > kMinimumPinchDelta) NSLog(@"Zoom in");        else if(initialDistance - currentDistance > kMinimumPinchDelta) NSLog(@"Zoom out");    }    else if(phase == UITouchPhaseEnded)    {        initialDistance = 0;    }        return YES;}

 

#import 
#import "EventInterceptWindow.h"@class ViewController;@interface AppDelegate : UIResponder
{ EventInterceptWindow *_window; ViewController *_viewController;}@property (strong, nonatomic) EventInterceptWindow *window;@property (strong, nonatomic) ViewController *viewController;@end

 

 

#import "AppDelegate.h"#import "ViewController.h"@implementation AppDelegate@synthesize window = _window;@synthesize viewController = _viewController;- (void)dealloc{    [_window release];    [super dealloc];}- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{    EventInterceptWindow *winTemp = [[EventInterceptWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];    self.window = winTemp;    [winTemp release];        ViewController *temp = [[ViewController alloc]initWithNibName:@"ViewController" bundle:nil];    self.viewController = temp;    [temp release];        self.window.rootViewController = _viewController;    [self.window makeKeyAndVisible];    return YES;}

转载于:https://www.cnblogs.com/pengyingh/articles/2490358.html

你可能感兴趣的文章
RESTful Mongodb
查看>>
BZOJ3237:[AHOI2013]连通图(线段树分治,并查集)
查看>>
如何提高Ajax性能
查看>>
Android--自定义加载框
查看>>
LINUX下 lamp安装及配置
查看>>
BZOJ3105 [cqoi2013]新Nim游戏
查看>>
困惑的前置操作与后置操作
查看>>
SDNU 1269.整数序列(水题)
查看>>
BZOJ 2118 Dijkstra
查看>>
Go语言基础之结构体
查看>>
SpringCloud:Eureka Client项目搭建(Gradle项目)
查看>>
jqueryValidate
查看>>
ATL使用IE控件,并且屏蔽右键
查看>>
Jenkins
查看>>
linux下使用screen和ping命令对网络质量进行监控
查看>>
数据库设计技巧
查看>>
css定位概述
查看>>
C# 动态修改配置文件 (二)
查看>>
BOM:文档对象模型 --树模型
查看>>
我的Android进阶之旅------>WindowManager.LayoutParams介绍
查看>>