ইউআইটিপপেশারআর সনাক্তকারী - একক ট্যাপ এবং ডাবল আলতো চাপুন


156

আমি UITapGestureRecognizersএকটি ভিউতে 2 টি যুক্ত করার চেষ্টা করছি , একটিতে একক ট্যাপের জন্য এবং একটিতে ডাবল ট্যাপ ইভেন্টের জন্য। একক ট্যাপ শনাক্তকারী প্রত্যাশার মতো কাজ করছে (নিজেরাই)। তবে আমি ডাবল ট্যাপ শনাক্তকারীকে কাজ করতে সক্ষম বলে মনে হচ্ছে না।

এর মতো বৈশিষ্ট্য নিয়ে পরীক্ষা করার চেষ্টা: cancelsTouchesInView, delaysTouchesBeganএবং delaysTouchesEndedকিন্তু এখনও কাজ করে না।

আমি যখন ডাবল ট্যাপ করি তখন একক ট্যাপ শনাক্তকারী সর্বদা সক্রিয় হয়ে যায় এবং ডাবল ট্যাপ ইভেন্টটিও সুপার ভিউতে প্রেরণ করা হত। তবে কাস্টম ডাবল ট্যাপ শনাক্তকারীটিকে মোটেই অবহিত করা হবে বলে মনে হয় না।

ডকুমেন্টেশনগুলি বলে মনে হচ্ছে যে উপরে বর্ণিত 3 টি সম্পত্তি ব্যবহার করা যেতে পারে। তবে আমি ঠিক নিশ্চিত নই যে কোন মানগুলি সেট করা উচিত এবং কোন স্বীকৃতিদানকারী (গুলি) (একক, দ্বিগুণ বা উভয়)। আশা করি এর সাথে পরিচিত কেউ সহায়তা করতে পারে।

নিম্নলিখিতটি সর্বশেষ আপডেট হওয়া কোড ব্লক।

// ****** gesture recognizers ******

- (void)addSingleAndDoubleTapGestureRecognizersToView:(UIView *)view
{
    // single tap    
    UITapGestureRecognizer *singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget: tableViewController action: @selector(handleSingleTapOnView:)];                                 
    [singleTapRecognizer setNumberOfTouchesRequired:1];
    [view addGestureRecognizer: singleTapRecognizer];

    // double tap 
    UITapGestureRecognizer *doubleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget: tableViewController action: @selector (handleDoubleTapOnView:)];        
    [doubleTapRecognizer setNumberOfTouchesRequired:2];         
    [singleTapRecognizer requireGestureRecognizerToFail: doubleTapRecognizer];
    [view addGestureRecognizer: doubleTapRecognizer];         
}

- (void)handleSingleTapOnView:(id)sender
{

}

- (void)handleDoubleTapOnView:(id)sender
{

}

30
এলোমেলো মন্তব্য: ভেরিয়েবলের নামগুলিতে আন্ডারস্কোরগুলি বেশিরভাগ উদ্দেশ্য-সি প্রোগ্রামারগুলিকে সঙ্কুচিত করে তুলবে। সবচেয়ে খারাপটি হ'ল আপনার পরিবর্তনশীল নামগুলি বর্ণনামূলক নয়। কেন কেবল সিঙ্গলট্যাপরেকনাইজার এবং ডাবলট্যাপ্রেকনাইজার (বা এরকম কিছু) ব্যবহার করবেন না? এটি টাইপ করতে আরও একটি বিভক্ত সময় লাগে, কিন্তু আপনার কোড অসীম আরও পাঠযোগ্য।
ইউআইএডাম

পরামর্শের জন্য ধন্যবাদ, আপনার সাথে সম্মত হন যে পরিবর্তনশীল নামগুলি আরও বর্ণনামূলক হওয়া উচিত। তবে এই নির্দিষ্ট কোড বিভাগটি চূড়ান্ত হয়নি এবং প্রস্তাবিত হিসাবে আরও পোলিশ এবং বর্ণনামূলক কোড পোস্ট করবে ...
স্ট্যানলে

অন্য কারও ক্ষেত্রে একই সমস্যা রয়েছে। আমি ডাবল ট্যাপ এবং একক ট্যাপ শনাক্তকারীদের দ্রুত একসঙ্গে কাজ করার জন্য সংগ্রাম করেছিলাম (একক ট্যাপটি ভাল কাজ করছিল, তবে কোনও ডাবল ট্যাপ নয়)। আমি স্টোরিবোর্ড ব্যবহার করে সনাক্তকারীদের টেনে নিয়ে এসেছি। আমার হ্যান্ডলারগুলি এবং স্টেটমেন্টটি ছিল: আমার ভিডিডিএলএডের ভিতরে সিঙ্গলট্যাপরেকগনাইজার.সেকুয়ারজিস্টারআরকনগাইজার টোফেইল (ডাবলট্যাব্রেকনগাইজার), তবে এখনও কোনও ডাবল ট্যাপ নেই। ধাঁধাটির আমার অনুপস্থিত অংশটি ছিল ডাবল ট্যাপ সনাক্তকারী আইকনটি (দৃশ্যের উপরের সারি থেকে) দেখার অংশটির উপরে যেখানে ডাবল ট্যাপটি স্বীকৃতি দিতে হবে তা ধরে টানতে।
পলাস

1
@ ইউআইএডাম অবজেক্টে একটি প্রাইভেট আইভার নাম উপসর্গের জন্য আন্ডারস্কোর ব্যবহার করে মোটামুটি সাধারণ যদিও না? (একটি তীব্র পটভূমি থেকে আসা)
চার্লটন প্রোভ্যাটাস

উত্তর:


412
UITapGestureRecognizer *singleTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doSingleTap)] autorelease];
singleTap.numberOfTapsRequired = 1; 
[self.view addGestureRecognizer:singleTap];

UITapGestureRecognizer *doubleTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doDoubleTap)] autorelease];
doubleTap.numberOfTapsRequired = 2; 
[self.view addGestureRecognizer:doubleTap];

[singleTap requireGestureRecognizerToFail:doubleTap];

দ্রষ্টব্য: আপনি যদি এটি ব্যবহার করেন numberOfTouchesRequired তবে তা হতে হবে .numberOfTouchesRequired = 1;

সুইফ্টের জন্য

let singleTapGesture = UITapGestureRecognizer(target: self, action: #selector(didPressPartButton))
singleTapGesture.numberOfTapsRequired = 1
view.addGestureRecognizer(singleTapGesture)

let doubleTapGesture = UITapGestureRecognizer(target: self, action: #selector(didDoubleTap))
doubleTapGesture.numberOfTapsRequired = 2
view.addGestureRecognizer(doubleTapGesture)

singleTapGesture.require(toFail: doubleTapGesture)

উত্তরের জন্য ধন্যবাদ, আপনার কোড চেষ্টা করেছেন কিন্তু এটি এখনও কাজ করছে না। এখনও কিছু আছে যা আমি মিস করেছি। আপনার কি আরও ইঙ্গিত আছে?
স্ট্যানলি

আমি কি এর জন্য আপনার বাস্তবায়ন ফাইল রাখতে পারি?
অনিল কোঠারি

@ স্ট্যানলি: অনিলের উত্তরটি কাজ করা উচিত, অবশ্যই আপনাকে হ্যান্ডলারগুলিও সরবরাহ করতে হবে (ডসিংটেলট্যাপ, ডুডাবলট্যাপ)
রোক

একক ট্যাপ একটি ইউআইটিবেল ভিউ আপডেট করে যা প্রত্যাশা অনুযায়ী কাজ করে working ডাবল ট্যাপ, আপাতত, NSLog ব্যবহার করে একটি লগ স্টেটমেন্ট আউটপুট দেয়। আমার সন্দেহ হ'ল আমি উত্তর প্রতিক্রিয়া স্থিতিটি ইউআইভিউভিউ থেকে প্রথম ট্যাপের পরে অন্য কোথাও গিয়েছি কারণ আমি সাড়া শৃঙ্খলা সম্পর্কে স্পষ্টভাবে কিছুই করি নি।
স্ট্যানলি

6
সমাধানটি আমার পক্ষে কাজ করে। একক ট্যাপ নির্বাচনকারীকে কিছুটা বিলম্বের পরে বরখাস্ত করা হয়েছে।
ভ্লাদিমির ওব্রিজান

46

সুইফট 3 সমাধান:

let singleTap = UITapGestureRecognizer(target: self, action:#selector(self.singleTapAction(_:)))
singleTap.numberOfTapsRequired = 1
view.addGestureRecognizer(singleTap)

let doubleTap = UITapGestureRecognizer(target: self, action:#selector(self.doubleTapAction(_:)))
doubleTap.numberOfTapsRequired = 2
view.addGestureRecognizer(doubleTap)

singleTap.require(toFail: doubleTap)

কোড লাইনে সিঙ্গলট্যাপ.রেকায়ার (টুফেইল: ডাবলট্যাপ) আমরা একক ট্যাপটি অপেক্ষা করতে এবং নলের ইভেন্টটি ডাবল ট্যাপ নয় তা নিশ্চিত করতে বাধ্য করছি।


31

আপনার প্রয়োজনীয় গ্যাস্টারআরকনগাইজারটিফয়েল: পদ্ধতিটি ব্যবহার করা দরকার। এটার মতো কিছু:

[singleTapRecognizer requireGestureRecognizerToFail:doubleTapRecognizer];


"ব্যর্থ" পদ্ধতির কলটি এখনই আবার দু'জন স্বীকৃতির সাথে কল করার চেষ্টা করেছে। কিন্তু এখনও কাজ করে না। আপনি যদি ডাবল ট্যাপ জিনিসটি আগে কাজ করে থাকেন তবে দয়া করে আপনার অভিজ্ঞতার আরও কিছুটি আমার সাথে ভাগ করুন।
স্ট্যানলে

1
আমি এই সঠিক কোডটি চেষ্টা করেছি (অনিল আরও বিশদে পোস্ট করেছেন এমনটিই) এবং এটি আমার পক্ষে কাজ করে।
ইউআইএডাম

মন্তব্যের জন্য ধন্যবাদ, তারপরে অবশ্যই এমন কিছু থাকা উচিত যা আমি আমার পক্ষ থেকে মিস করেছি ...
স্ট্যানলি

আপনার কোডটি এখনও বিলম্বিত স্পর্শগুলি এবং হোয়াট নোটের সাথে মেসেজ করে। এটি তৈরি করুন যাতে এটি অনিলের কোডটি ঠিক অনুসরণ করে। আমাদের যেভাবে এটি করা হয়েছে কেবলমাত্র প্রয়োজনীয় গেস্টচারআর সনাক্তকারী টোফেইল ব্যবহার করুন।
ইউআইএডাম

আপনি এই মুহুর্তের জন্য সময়ের বাইরে চলে যাচ্ছি বলে আপনি আজ বা কালকে পরামর্শ দিয়েছিলেন। আপনার সদয় সহায়তার জন্য ধন্যবাদ ...
স্ট্যানলি

15

// ---- প্রথমত আপনাকে দ্বিগুণ এবং একক ট্যাপ অঙ্গভঙ্গি বরাদ্দ করতে হবে ------- //

UITapGestureRecognizer* doubleTap = [[UITapGestureRecognizer alloc] initWithTarget : self action : @selector (handleDoubleTap:)];

UITapGestureRecognizer* singleTap = [[UITapGestureRecognizer alloc] initWithTarget : self action : @selector (handleSingleTap:)];

[singleTap requireGestureRecognizerToFail : doubleTap];
[doubleTap setDelaysTouchesBegan : YES];
[singleTap setDelaysTouchesBegan : YES];

// ----------------------- ট্যাপের সংখ্যা ---------------- //

[doubleTap setNumberOfTapsRequired : 2];
[singleTap setNumberOfTapsRequired : 1];

// ------- ভিউ বা বোতামে ডাবল ট্যাপ এবং একক ট্যাপ অঙ্গভঙ্গি যুক্ত করুন -------- //

[self.view addGestureRecognizer : doubleTap];
[self.view addGestureRecognizer : singleTap];

10

আপনি ঠিক এটি যা খুঁজছেন তা নিশ্চিত না, তবে আমি অঙ্গভঙ্গি সনাক্তকারী ছাড়াই একক / ডাবল ট্যাপ করেছিলাম। আমি এটি একটি ইউআইটিএবলভিউতে ব্যবহার করছি, তাই আমি সেই কোডটি ডিলেক্টরোউএটিআইএনডেক্সপথ পদ্ধতিতে ব্যবহার করেছি

    tapCount++;
    switch (tapCount)
    {
        case 1: //single tap
            [self performSelector:@selector(singleTap:) withObject: indexPath afterDelay: 0.2];
            break;
        case 2: //double tap
            [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(singleTap:) object:indexPath];
            [self performSelector:@selector(doubleTap:) withObject: indexPath];
            break;
        default:
            break;
    }
    if (tapCount>2) tapCount=0;

প্যারামিটার হিসাবে NSIndexPath এর সাথে পদ্ধতিগুলি সিঙ্গলট্যাপ এবং ডাবলট্যাপ কেবল অকার্যকর:

- (void)singleTap:(NSIndexPath *)indexPath {
  //do your stuff for a single tap
}

- (void)doubleTap:(NSIndexPath *)indexPath {
  //do your stuff for a double tap
}

আশা করি এটা সাহায্য করবে


উত্তরের জন্য ধন্যবাদ, নোভার্গ। ডাবলট্যাপ সনাক্তকারীদের নিয়ে আমার যে সমস্যা হচ্ছে তা কি ছিল?
স্ট্যানলি

@ স্ট্যানলে না, সিঙ্গলট্যাপ গুলি করার আগে 0.2 সেকেন্ড অপেক্ষা করছে। এবং যদি মাঝামাঝি সময়ে দ্বিতীয় ট্যাপটি সক্রিয় করা হয়, তবে সিঙ্গলট্যাপ পদ্ধতি বাতিল হয়ে যায়।
নোভার্গ

এটি খুব আশাব্যঞ্জক দেখাচ্ছে, আপনার সহায়তার জন্য ধন্যবাদ। আজ আবার সময়ের বাইরে চলে যাচ্ছি। আগামীকাল অবশ্যই চেষ্টা করে দেখুন :)
স্ট্যানলি

সৃজনশীল উত্তর;)
মাইকেল

খুব ভাল সমাধান। নিম্নলিখিত স্পর্শগুলিও স্বীকৃত হয়েছে তা নিশ্চিত করার জন্য আমার কেবল প্রতিটি হ্যান্ডলারের (সিঙ্গলট্যাপ, ডাবলট্যাপ) ট্যাপকন্ট = 0 যুক্ত করার দরকার ছিল।
সিরিও

3

সুইফট 2 এর সমাধান:

let singleTapGesture = UITapGestureRecognizer(target: self, action: #selector(handleSingleTap))
singleTapGesture.numberOfTapsRequired = 1 // Optional for single tap
view.addGestureRecognizer(singleTapGesture)

let doubleTapGesture = UITapGestureRecognizer(target: self, action: #selector(handleDoubleTap))
doubleTapGesture.numberOfTapsRequired = 2
view.addGestureRecognizer(doubleTapGesture)

singleTapGesture.requireGestureRecognizerToFail(doubleTapGesture)

1

আমি সিঙ্গলট্যাপ এবং ডাবলট্যাপ উভয়ই সনাক্ত করতে ইউআইজিস্টারআরকনাইজারডেলিগেট পদ্ধতি প্রয়োগ করেছি।

শুধু এই কাজ।

 UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleDoubleTapGesture:)];
    [doubleTap setDelegate:self];
    doubleTap.numberOfTapsRequired = 2;
    [self.headerView addGestureRecognizer:doubleTap];

    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleSingleTapGesture:)];
    singleTap.numberOfTapsRequired = 1;
    [singleTap setDelegate:self];
    [doubleTap setDelaysTouchesBegan:YES];
    [singleTap setDelaysTouchesBegan:YES];
    [singleTap requireGestureRecognizerToFail:doubleTap];
    [self.headerView addGestureRecognizer:singleTap];

তারপরে এই প্রতিনিধি পদ্ধতিগুলি বাস্তবায়ন করুন।

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    return  YES;
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
    return YES;
}

0

কিছু দর্শনের নিজস্ব ডাবল ট্যাপ শনাক্তকারীগুলি অন্তর্নির্মিত রয়েছে ( MKMapViewউদাহরণ হিসাবে)। এটি কাছাকাছি পেতে আপনাকে UIGestureRecognizerDelegateপদ্ধতিটি প্রয়োগ করতে হবে shouldRecognizeSimultaneouslyWithGestureRecognizerএবং ফিরে আসতে হবে YES:

প্রথমে আপনার ডাবল এবং একক স্বীকৃতিদানকারীকে প্রয়োগ করুন:

// setup gesture recognizers
UITapGestureRecognizer* singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                                action:@selector(mapViewTapped:)];
singleTapRecognizer.delegate = self;
singleTapRecognizer.numberOfTapsRequired = 1;


UITapGestureRecognizer* doubleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                                      action:@selector(mapViewDoubleTapped:)];
doubleTapRecognizer.delegate = self;    // this allows
doubleTapRecognizer.numberOfTapsRequired = 2;
[singleTapRecognizer requireGestureRecognizerToFail:doubleTapRecognizer];

এবং তারপরে প্রয়োগ করুন:

#pragma mark UIGestureRecognizerDelegate
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer
*)otherGestureRecognizer {  return YES; }

-1

@ স্ট্যানলির মন্তব্যের প্রসঙ্গে -

UITableViewইতিমধ্যে সম্পূর্ণ আলতো চাপানো হ্যান্ডলিং রয়েছে বলে কাজ করতে সারি নির্বাচনের জন্য ট্যাপ অঙ্গভঙ্গি চেষ্টা ও ব্যবহার করবেন না ....

তবে আপনার একক ট্যাপ অঙ্গভঙ্গি শনাক্তকারীদের অবশ্যই 'ভিউতে ক্যান্সেলস টাচ' '' না '' তে সেট করতে হবে বা এটি কখনও ট্যাপের ইভেন্টগুলি পাবে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.