1. 程式人生 > >ios數字鍵盤,點選手勢、滑動、長按手勢並存,解決手勢衝突問題

ios數字鍵盤,點選手勢、滑動、長按手勢並存,解決手勢衝突問題

嗯,之所以有手勢衝突,是因為數字鍵原來的開發定義的是uibutton,有事件衝突。關掉數字鍵的響應 enabled = false。手勢全部加入到數字鍵的super view,天然的系統就支援流暢的多手勢。如果點選的話,就判斷點選的點是否落在UILabel的frame裡面即可。

    //1-0數字數字背景view
            UIView *numberBtnBgView = [[UIView alloc] initWithFrame:CGRectMake(0, 5, self.frame.size.width, 50)];
            numberBtnBgView.userInteractionEnabled = YES;
            //增加滑動手勢
            [numberBtnBgView addGestureRecognizer:[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panTopViewChangedMouseLocation:)]];
            //增加單擊手勢
            UITapGestureRecognizer *tapSuperGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(numberTapGesture:)];
            [numberBtnBgView addGestureRecognizer:tapSuperGesture];
            //增加長按手勢
            UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(numberLongPressKeyboardView:)];
            [numberBtnBgView addGestureRecognizer:longPress];
            [self addSubview:numberBtnBgView];
            
            //記錄數字鍵
            self.mutKeyBtns = [NSMutableArray array];
            
            for (int i = 0; i < 10; i ++) {
                YMKeyButton *btn = [[YMKeyButton alloc] initWithFrame:CGRectMake(3+i*(spaceWidth+kYMKeyButtonWidth*(kKeyWindow.width/375.0)), 5, 0, 0)];
                [btn setTitle:@((i+1)%10).stringValue forState:UIControlStateNormal];
                btn.enabled = NO;
                [btn setBackgroundImage:[UIImage imageNamed:@"key_bg_white"] forState:UIControlStateDisabled];
                [self.mutKeyBtns addObject:btn];
                btn.userInteractionEnabled = NO;
                [self addSubview:btn];
            }

對應的手勢響應事件:

#pragma mark - 數字鍵盤左右移動滑動游標手勢響應事件
- (void)panTopViewChangedMouseLocation:(UIPanGestureRecognizer *)pan
{
    CGPoint point = [pan translationInView:self];
    static CGPoint center;
    switch (pan.state) {
        case UIGestureRecognizerStateBegan:
            center = point;
            break;
        case UIGestureRecognizerStateChanged:
            if (point.x-center.x>5.0) {
                if (_delegate && [_delegate respondsToSelector:@selector(YMKeyboard:moveMouseLocation:)]) {
                    [_delegate YMKeyboard:self moveMouseLocation:1];
                }
                center = point;
            } else if (center.x-point.x>5.0) {
                if (_delegate && [_delegate respondsToSelector:@selector(YMKeyboard:moveMouseLocation:)]) {
                    [_delegate YMKeyboard:self moveMouseLocation:-1];
                }
                center = point;
            }
            break;
            
        default:
            break;
    }
}
#pragma mark - 數字鍵盤長按手勢響應事件
- (void)numberLongPressKeyboardView:(UILongPressGestureRecognizer *)gesture{
    CGPoint point = [gesture locationInView:self];
    NSInteger  clickIndex = -1;
    for (NSInteger i = 0; i<self.mutKeyBtns.count; i++) {
        YMKeyButton *btn = self.mutKeyBtns[i];
        BOOL isContain =  CGRectContainsPoint(btn.frame,point);
        if (isContain) {
            clickIndex = i ;
        }
    }
    if (clickIndex == -1) {
        return;
    }else{
        //如果長按的是數字鍵盤區域
        YMKeyButton *btn = self.mutKeyBtns[clickIndex];
        switch (gesture.state) {
            case UIGestureRecognizerStateCancelled:
            case UIGestureRecognizerStateEnded:
                [self.popView removeFromSuperview];
                
                // 新增輸入框的內容
                if (btn) {}
                
                break;
                
            case UIGestureRecognizerStateBegan:
            case UIGestureRecognizerStateChanged: {
                
                if (!self.popView.superview) {
                    [self.popView showFrom:btn];
                }
                
                break;
            }
            default:
                break;
        }
    }
}
#pragma mark - 1-0 數字點選手勢響應事件
- (void)numberTapGesture:(UITapGestureRecognizer *)gesture{
    CGPoint point = [gesture locationInView:self];
    NSInteger  clickIndex = -1;
    for (NSInteger i = 0; i<self.mutKeyBtns.count; i++) {
        YMKeyButton *btn = self.mutKeyBtns[i];
        BOOL isContain =  CGRectContainsPoint(btn.frame,point);
        if (isContain) {
            clickIndex = i ;
        }
    }
    if (clickIndex == -1) {
        return;
    }else{
        [self clickNumberBtn:self.mutKeyBtns[clickIndex]];
    }
}

相關推薦

VS程式設計編輯WPF過程中設計器中介面某一控制元件在XAML中高亮突出顯示相應的控制元件程式碼的設定方法。

在編輯製件WPF過程中,當介面中控制元件較多時,可通過點選設計器中具體的控制元件,從而中在xaml程式碼視窗中快速跳轉到對應的部分。為了突出顯示該部分控制元件程式碼的名稱,方便視覺上直觀的觀察到被選中的控制元件對應的XAML程式碼,可以在VS中設定:選中控制元件後,高亮顯示對應的XAML

vue滑動等事件處理(自定義指令)

將以下程式碼封裝在一個js檔案裡,註釋很詳細,就不解釋了 import Vue from 'vue'; /** * @param el 繫結的DOM * @param binding 自定義指令中的binding物件 * @param type 繫結的事件型別 *

ViewPager和Testview結合使用切換和滑動切換

  老規矩,第一先上圖,這樣是為了讓大家能知道是不是想要的效果。       開始上程式碼了: 首先是Activity的xml: <?xml version="1.0" encoding="utf-8"?> <

TabLayout和RecyclerView結合TabLayout會切換到對應的RecyclerView位置滾動RecyclerView時TabLayout會跟著切換到對應位置。

一、效果圖   二、實現原理 1、頁面佈局從上到下為:頂部的“title”->title下面隱藏的tablayout(mainTab)->最底部的recycle人view,其中recycleview包含 1)自己的頭部、2)頭部下面的tablayout(tvT

ios數字鍵盤手勢滑動手勢並存解決手勢衝突問題

嗯,之所以有手勢衝突,是因為數字鍵原來的開發定義的是uibutton,有事件衝突。關掉數字鍵的響應 enabled = false。手勢全部加入到數字鍵的super view,天然的系統就支援流暢的多手勢。如果點選的話,就判斷點選的點是否落在UILabel的frame裡面即可

一個可以隨手勢拖動的EditText更改內容附帶解決鍵盤遮擋終極方法

慣例先來看效果圖: 最近產品同學的需求,要求定製一個可拖拽可編輯的文字,原本覺得還挺簡單,不就是寫個EditText處理一下touch事件麼,後來做了發現還有些小坑,記錄一下,順便給大家做個參考。 試錯 首先我嘗試自定義一個EditText,重寫o

iOS開發中介面空白處或背景收起鍵盤

在iOS開發中,我們會在UITextView、UITextField等控制元件裡編輯或者輸入文字結束後,需要關閉鍵盤。最經常的是,點選介面空白處或點選背景收起鍵盤。 通過在在viewDidLoad中新

[IOS]Uiwebview+js圖片得到地址

網上的教程你複製我,我複製你,特別容易誤導像我這樣的新手,好不容易找到一個方法,卻因為 網上給的js程式碼用了系統的click方法,導致一直無效。 網頁中圖片的節點是 img,利用js 得到圖片節點下的所有地址,並且為每一個圖片新增點選事件 點選時,觸發一個url,即圖片的地址。

微信JSSDK上傳預覽多圖ios/Android。檢視大圖支援滑動

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=dev

vue自定義移動端touch事件滑動事件

**HTML** <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <link href="favicon.ico" mce_href="favicon.

佈局中同時使用Toolbar和EditText時鍵盤彈出時標題欄被拉伸

在Toolbar中新增 android:fitsSystemWindows="true" 這時,如果我們的layout中包含可滾動的控制元件如ListView、ScrollView(即在鍵盤彈出時會

jq 鍵盤事件鍵盤上的上鍵input上一個獲取焦點下鍵input下一個獲取焦點

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <script

js自定義右鍵選單自定義選單隱藏顯示指定div

       首先寫好自己想要的右鍵選單的樣子,然後設定該選單div為預設隱藏,滑鼠右擊後設置css顯示該選單(display:block;),並禁用瀏覽器右鍵預設選單。 接下來就可以寫選單中具體項的

iOS 事件穿透穿透控制元件不響應事件

前言 小夥伴們在開發中是否遇到過這樣的需求呢,一個控制元件的某個部分被另外一個控制元件遮擋住,當點選這個重疊部分時,需要響應被遮蓋控制元件的點選事件,就如下圖所示 當我們點選區域3時,響應藍色按鈕的點選事件,點選區域1和2時,響應紅色按鈕的點選事件,對於區域1和3沒什麼好說的,那如何讓紅色按鈕響應區域2

移動端HTML5ios(針對safari瀏覽器)事件閃現黑灰色背景解決方案

移動端HTML5,ios(針對safari瀏覽器)點選事件閃現黑灰色背景解決方案 最近做一個h5內嵌頁,用了swiper,首屏並未使用點選事件,只是有圖片背景和文字。但是ios開發那邊發現 長按首屏,會閃現一個暗黑的半透明的遮罩,隨後消失。發現分享出去的頁面也有這個問題。 後來百度發現是

前端輸入密碼顯示**某個控制元件顯示數字

首先這個是回答別人問題的答案。但由於第一次貼上的答案是有bug的,所以想進行第二次回覆,結果被禁言了,一臉懵逼,好吧,禁就禁吧,我將答案寫成部落格不會被禁了吧?首先說明一下,這是基於jquery的 最簡單的是現有的可以用一下辦法         顯示密碼         $

android EditText彈鍵盤其他控制元件收鍵盤不觸發事件特1控制元件收鍵盤觸發特2控制元件不收鍵盤

說實話開發android,鍵盤真的很不聽話,非常難用,於是百度找到dispatchTouchEvent進行重寫可完成鍵盤收放,但還是不夠完美,我期望的功能如下: 1.基礎功能: a.點選輸入控制元件彈出鍵盤 b.點選非輸入控制元件收起鍵盤 2.特殊功能1

iOS UITextView 設定 NSLinkAttributeName 屬性連結跳轉

@interface ViewController ()<UITextViewDelegate>- (void)viewDidLoad{    [super viewDidLoad];    NSMutableAttributedString *str = [[NSMutableAttribu

IOS自定義圖片瀏覽器支援瀏覽多張圖片雙擊兩手指縮放操作並顯示載入進度條

圖片瀏覽器Controller的主要思路是:新建一個 JZAlbumViewController,在這個controller裡主要顯示一個UIScrollView,這個UIScrollView用來顯

Android相簿支援檢視本地相簿放大圖片滑動切換圖片手勢放大縮小

最近在做一個專案,需要用到點選選擇相簿圖片和展示好友說說圖片,之前也未接觸過,找了很久,都沒有找到我想要的效果,不是隻能檢視相簿點選放大,要不就只是左右滑動的demo,於是修改了兩個大神的程式碼(來源