天天看點

iphone的Touch事件

iphone的Touch事件

花了點時間整理了一下關于Touch事件的一些方法。

輕擊:

需要在你的ViewController裡重寫幾個方法:

//開始觸摸的方法

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

    messageLabel.text = @"Touches Began"; //開始觸摸的方法

    [self updateLabelsFromTouches:touches];

}

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

    messageLabel.text = @"Touches Cancelled";//觸摸取消的方法

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

    messageLabel.text = @"Touches Stopped.";//觸摸結束的方法

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

    messageLabel.text = @"Drag Detected";//觸摸移動的方法

觸摸-清掃:

    UITouch *touch = [touches anyObject];

    gestureStartPoint = [touch locationInView:self.view];//開始觸摸

    CGPoint currentPosition = [touch locationInView:self.view];

    CGFloat deltaX = fabsf(gestureStartPoint.x - currentPosition.x);

    CGFloat deltaY = fabsf(gestureStartPoint.y - currentPosition.y);

    if (deltaX >= kMinimumGestureLength && deltaY <= kMaximumVariance) {

        label.text = @"Horizontal swipe detected";//水準消除

        [self performSelector:@selector(eraseText)

                   withObject:nil afterDelay:2];

    }

    else if (deltaY >= kMinimumGestureLength &&

             deltaX <= kMaximumVariance){

        label.text = @"Vertical swipe detected";//垂直消除

        [self performSelector:@selector(eraseText) withObject:nil

                   afterDelay:2];

//kMinimumGestureLength 最小移動長度 kMaximumVariance 最大偏移長度

多次輕擊判斷,比如輕按兩下,三擊等:

- (void)singleTap {

    singleLabel.text = @"Single Tap Detected";//單擊動作響應事件

    [self performSelector:@selector(eraseMe:)

               withObject:singleLabel afterDelay:1.6f];//1.6秒後執行eraseMe方法

- (void)doubleTap {

    doubleLabel.text = @"Double Tap Detected";//輕按兩下

               withObject:doubleLabel afterDelay:1.6f];

- (void)tripleTap {

    tripleLabel.text = @"Triple Tap Detected";//三擊

               withObject:tripleLabel afterDelay:1.6f];

- (void)quadrupleTap {

    quadrupleLabel.text = @"Quadruple Tap Detected";//四擊

               withObject:quadrupleLabel afterDelay:1.6f];

- (void)eraseMe:(UITextField *)textField {

    textField.text = @"";

    UITouch *touch = [touches anyObject];//執行個體一個uitouch

    NSUInteger tapCount = [touch tapCount]; //計算touch的tapCount次數

    switch (tapCount) {

        case 1:

            [self singleTap];

            break;

        case 2:

            [self doubleTap];

        case 3:

            [self tripleTap];

        case 4:

            [self quadrupleTap];

        default:

    [self performSelector:@selector(eraseMe:)withObject:singleLabel afterDelay:1.6f]中

performSelector:@selector(eraseMe:)withObject:singleLabel afterDelay:1.6f方法為将來afterDelay1.6秒之後調用eraseMe方法

同樣的[NSObect  cancelPreviousPerformSelector:withObject :afterDelay:];

 方法為取消這些将來的調用

捏合操作:

- (void)eraseLabel {//清空lable

    label.text = @"";

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {//開始觸碰

    if ([touches count] == 2) {//檢測是否為兩個手指觸點

        NSArray *twoTouches = [touches allObjects];

        UITouch *first = [twoTouches objectAtIndex:0];

        UITouch *second = [twoTouches objectAtIndex:1];

        initialDistance = distanceBetweenPoints(

                                                [first locationInView:self.view], 

                                                [second locationInView:self.view]);

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {//移動手指

    if ([touches count] == 2) {

        CGFloat currentDistance = distanceBetweenPoints(

                                                        [first locationInView:self.view],

                                                        [second locationInView:self.view]);

        if (initialDistance == 0)

            initialDistance = currentDistance; //根據移動前後的坐标距離差檢測是捏合的手勢還是打開的手勢

        else if (currentDistance - initialDistance > kMinimumPinchDelta) {//檢測是否大于最小移動值kMinimumPinchDelta

            label.text = @"Outward Pinch";

            [self performSelector:@selector(eraseLabel) 

                       withObject:nil 

                       afterDelay:1.6f];

        }

        else if (initialDistance - currentDistance > kMinimumPinchDelta) {

            label.text = @"Inward Pinch";

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {//觸碰結束

    initialDistance = 0;

自定義手勢“√”:

- (void)eraseLabel {

    CGPoint point = [touch locationInView:self.view];

    lastPreviousPoint = point;

    lastCurrentPoint = point;

    lineLengthSoFar = 0.0f;

    CGPoint previousPoint = [touch previousLocationInView:self.view];

    CGPoint currentPoint = [touch locationInView:self.view];

    CGFloat angle = angleBetweenLines(lastPreviousPoint, //計算兩條線之間的角度

                                      lastCurrentPoint, 

                                      previousPoint, 

                                      currentPoint);

    if (angle >= kMinimumCheckMarkAngle&& angle <= kMaximumCheckMarkAngle 

        && lineLengthSoFar > kMinimumCheckMarkLength) {//檢測手勢被承認的條件 kMinimumCheckMarkAngle 最小角度kMaximumCheckMarkAngle最大角度kMinimumCheckMarkLength 畫線最小長度

        label.text = @"Checkmark";

        [self performSelector:@selector(eraseLabel)

                   withObject:nil afterDelay:1.6];

    lineLengthSoFar += distanceBetweenPoints(previousPoint, currentPoint);//lineLengthSoFar , lastPreviousPoint, lastCurrentPoint 重新指派

    lastPreviousPoint = previousPoint;

    lastCurrentPoint = currentPoint;

這裡用到一個判斷兩條直線的角度的方法 angleBetweenLines(CGPoint line1Start, CGPoint line1End, CGPoint line2Start, CGPointlin2End);

給一個幾何方法集的接口方法:

CGPointUtils.h 頭檔案

#import <CoreGraphics/CoreGraphics.h>

CGFloat distanceBetweenPoints (CGPoint first, CGPoint second);

CGFloat angleBetweenPoints(CGPoint first, CGPoint second);

CGFloat angleBetweenLines(CGPoint line1Start, CGPoint line1End, CGPoint line2Start, CGPoint lin2End);

.c檔案 CGPointUtils.c

#include "CGPointUtils.h"

#include <math.h>

#define pi 3.14159265358979323846

#define degreesToRadian(x) (pi * x / 180.0)

#define radiansToDegrees(x) (180.0 * x / pi)

CGFloat distanceBetweenPoints (CGPoint first, CGPoint second) {

CGFloat deltaX = second.x - first.x;

CGFloat deltaY = second.y - first.y;

return sqrt(deltaX*deltaX + deltaY*deltaY );

};

CGFloat angleBetweenPoints(CGPoint first, CGPoint second) {

CGFloat height = second.y - first.y;

CGFloat width = first.x - second.x;

CGFloat rads = atan(height/width);

return radiansToDegrees(rads);

//degs = degrees(atan((top - bottom)/(right - left)))

CGFloat angleBetweenLines(CGPoint line1Start, CGPoint line1End, CGPoint line2Start, CGPoint line2End) {

CGFloat a = line1End.x - line1Start.x;

CGFloat b = line1End.y - line1Start.y;

CGFloat c = line2End.x - line2Start.x;

CGFloat d = line2End.y - line2Start.y;

CGFloat rads = acos(((a*c) + (b*d)) / ((sqrt(a*a + b*b)) * (sqrt(c*c + d*d))));

把他加到工程裡 在需要的地方#import "CGPointUtils.h" 就可以直接用了