加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ios – 如何在Xcode中跟踪多个触摸

发布时间:2020-12-15 01:41:17 所属栏目:百科 来源:网络整理
导读:最近我正在创建一个可以同时拖动多个对象的应用程序.我曾尝试使用UIPanGestureRecognizer来获取手指触摸的坐标,但我不知道哪个触摸属于哪个手指. 我需要支持四个手指同时平移而不会使用Objective-C相互干扰. 我已经搜索了一段时间的洗液,但他们显示的答案对
最近我正在创建一个可以同时拖动多个对象的应用程序.我曾尝试使用UIPanGestureRecognizer来获取手指触摸的坐标,但我不知道哪个触摸属于哪个手指.

我需要支持四个手指同时平移而不会使用Objective-C相互干扰.

我已经搜索了一段时间的洗液,但他们显示的答案对我不起作用.任何帮助,将不胜感激.

解决方法

我在相当长的一段时间内遇到了同样的问题并最终解决了它.以下是我的DrawView.m中的代码,它是UIView的子类,能够使用drawRect:支持绘图.

#import "DrawView.h"

#define MAX_TOUCHES 4

@interface DrawView() {

    bool touchInRect[MAX_TOUCHES];
    CGRect rects[MAX_TOUCHES];
    UITouch *savedTouches[MAX_TOUCHES];
}

@end

@implementation DrawView

-(id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        // Initialization code
        self.multipleTouchEnabled = YES;
        for (int i=0; i<MAX_TOUCHES; i++) {
            rects[i] = CGRectMake(200,200,50,50);
            savedTouches[i] = NULL;
            touchInRect[i] = false;
        }
    }
    return self;
}

- (void)drawRect:(CGRect)rect {
    // Drawing code
    [[UIColor blueColor] set];
    CGContextRef context = UIGraphicsGetCurrentContext();

    for (int i=0; i<MAX_TOUCHES; i++) {
        CGContextFillRect(context,rects[i]);
        CGContextStrokePath(context);
    }
}

#pragma mark - Handle Touches

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    NSArray *allTouches = [touches allObjects];
    for (int i=0; i<[allTouches count]; i++) {
        UITouch *touch = allTouches[i];
        CGPoint newPoint = [touch locationInView:self];

        for (int j=0; j<MAX_TOUCHES; j++) {
            if (CGRectContainsPoint(rects[j],newPoint) && !touchInRect[j]) {
                touchInRect[j] = true;
                savedTouches[j] = touch;
                break;
            }
        }
    }
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    NSArray *allTouches = [touches allObjects];
    for (int i=0; i<[allTouches count]; i++) {
        UITouch *touch = allTouches[i];
        CGPoint newPoint = [touch locationInView:self];

        for (int j=0; j<MAX_TOUCHES; j++) {
            if (touch == savedTouches[j]) {
                rects[j] = [self rectWithSize:rects[j].size andCenter:newPoint];
                [self setNeedsDisplay];
                break;
            }
        }
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

    NSArray *allTouches = [touches allObjects];
    for (int i=0; i<[allTouches count]; i++) {
        UITouch *touch = allTouches[i];

        for (int j=0; j<MAX_TOUCHES; j++) {
            if (touch == savedTouches[j]) {
                touchInRect[j] = false;
                savedTouches[j] = NULL;
                break;
            }
        }
    }
}


- (CGRect)rectWithSize:(CGSize)size andCenter:(CGPoint)point {
    return CGRectMake(point.x - size.width/2,point.y - size.height/2,size.width,size.height);
}

@end

我将MAX_TOUCHES设置为4,因此屏幕上会有四个对象.这个的基本概念是在调用touchesBegan ::时将每个UITouch ID存储在savedTouches数组中,然后在touchesMoved :: called时将每个ID与屏幕上的触摸进行比较.

只需将代码粘贴到.m文件中即可.示例结果如下所示:

enter image description here

希望这可以帮助 :)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读