iOS判斷捏合手勢方向(UIPanGestureRecognizer)

如題哥艇,捏合手勢并沒有提供判斷橫向還是豎向的判定方式。

但是手勢中有提供這個方法:

  • (CGPoint)locationOfTouch:(NSUInteger)touchIndex inView:(nullable UIView*)view;
    「返回一個給定視圖發(fā)生手勢的點(為了在多個手勢中捕獲位置)」

可以根據(jù)捏合手勢手指起止點做差比較判定捏合手勢方向:
方式一:
如果兩個捏合點X的差值大于Y的差值變化诡宗,那么就是橫向捏合玄糟;反之磷籍,為豎向捏合。搭配手勢提供的scale挤渐,可判斷為捏合放大還是捏合縮小苹享。
方式二:
只根據(jù)兩個捏合點之間的角度,估算捏合方向浴麻;

捏合.gif

簡單實現(xiàn)代碼如下:

#import "ViewController.h"

#define UI_SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)
#define UI_SCREEN_WIDTH [[UIScreen mainScreen] bounds].size.width

@interface ViewController ()

@property (nonatomic, assign) CGPoint pointOne;
@property (nonatomic, assign) CGPoint pointTwo;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UIView *panView = [[UIView alloc]initWithFrame:CGRectMake((UI_SCREEN_WIDTH - 300) / 2.0, (UI_SCREEN_HEIGHT - 300) / 2.0, 300, 300)];
    panView.backgroundColor = [UIColor redColor];
    [self.view addSubview:panView];
    panView.userInteractionEnabled = YES;

    UIPinchGestureRecognizer *pin = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinAction:)];
    [panView addGestureRecognizer:pin];
}

- (void)pinAction:(UIPinchGestureRecognizer *)recognizer {
    if (recognizer.numberOfTouches == 2) {
        CGPoint locationOne = [recognizer locationOfTouch:0 inView: recognizer.view];
        CGPoint locationTwo = [recognizer locationOfTouch:1 inView: recognizer.view];
        
        //方式一:比較X-Y差值變化
        CGFloat difference_X = fabs((locationOne.x - locationTwo.x) - (self.pointOne.x - self.pointTwo.x));
        CGFloat difference_Y = fabs((locationOne.y - locationTwo.y) - (self.pointOne.y - self.pointTwo.y));
        CGFloat scale = recognizer.scale;
        if (difference_X > difference_Y){
            NSLog(@"橫向捏合");
            //簡單邊界處理
            if (recognizer.view.frame.size.width * scale  > UI_SCREEN_WIDTH - 40 || recognizer.view.frame.size.width * scale < 100) {
                return;
            }
            recognizer.view.transform = CGAffineTransformScale(recognizer.view.transform, scale, 1);
        } else {
            NSLog(@"豎向捏合");
            //簡單邊界處理
            if (recognizer.view.frame.size.height * scale > UI_SCREEN_HEIGHT - 40 || recognizer.view.frame.size.height * scale < 100) {
                return;
            }
            recognizer.view.transform = CGAffineTransformScale(recognizer.view.transform, 1, scale);
        }
        recognizer.scale = 1.0;
        self.pointOne = [recognizer locationOfTouch:0 inView:recognizer.view];
        self.pointTwo = [recognizer locationOfTouch:1 inView:recognizer.view];
        
        //方式二:計算角度得问,估算捏合方向
//        CGFloat abSlope = ABS((locationTwo.y - locationOne.y) / (locationTwo.x - locationOne.x));
//        CGFloat scale = recognizer.scale;
//        if (abSlope < 1.0) {
//            //簡單邊界處理
//            if (recognizer.view.frame.size.width * scale  > UI_SCREEN_WIDTH - 40 || recognizer.view.frame.size.width * scale < 100) {
//                return;
//            }
//            recognizer.view.transform = CGAffineTransformScale(recognizer.view.transform, scale, 1);
//        }else {
//            //簡單邊界處理
//            if (recognizer.view.frame.size.height * scale > UI_SCREEN_HEIGHT - 40 || recognizer.view.frame.size.height * scale < 100) {
//                return;
//            }
//            recognizer.view.transform = CGAffineTransformScale(recognizer.view.transform, 1, scale);
//        }
//        recognizer.scale = 1.0;
    }
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市软免,隨后出現(xiàn)的幾起案子宫纬,更是在濱河造成了極大的恐慌,老刑警劉巖膏萧,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漓骚,死亡現(xiàn)場離奇詭異,居然都是意外死亡榛泛,警方通過查閱死者的電腦和手機蝌蹂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來曹锨,“玉大人孤个,你說我怎么就攤上這事∷蚁#” “怎么了硼身?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長覆享。 經(jīng)常有香客問我,道長营袜,這世上最難降的妖魔是什么撒顿? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮荚板,結果婚禮上凤壁,老公的妹妹穿的比我還像新娘吩屹。我一直安慰自己,他們只是感情好拧抖,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布煤搜。 她就那樣靜靜地躺著,像睡著了一般唧席。 火紅的嫁衣襯著肌膚如雪擦盾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天淌哟,我揣著相機與錄音迹卢,去河邊找鬼。 笑死徒仓,一個胖子當著我的面吹牛腐碱,可吹牛的內容都是我干的。 我是一名探鬼主播掉弛,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼症见,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了殃饿?” 一聲冷哼從身側響起谋作,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎壁晒,沒想到半個月后瓷们,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡秒咐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年谬晕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片携取。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡攒钳,死狀恐怖,靈堂內的尸體忽然破棺而出雷滋,到底是詐尸還是另有隱情不撑,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布晤斩,位于F島的核電站焕檬,受9級特大地震影響,放射性物質發(fā)生泄漏澳泵。R本人自食惡果不足惜实愚,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腊敲,春花似錦击喂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至没宾,卻和暖如春凌彬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背榕吼。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工饿序, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人羹蚣。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓原探,卻偏偏與公主長得像,于是被迫代替她去往敵國和親顽素。 傳聞我的和親對象是個殘疾皇子咽弦,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容