UILongPressGestureR সনাক্তকারীকে নীচে চাপলে দু'বার কল করা হয়


359

ব্যবহারকারী 2 সেকেন্ডের জন্য চেপে রেখেছেন কিনা তা আমি সনাক্ত করছি:

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]
                                             initWithTarget:self 
                                             action:@selector(handleLongPress:)];
        longPress.minimumPressDuration = 2.0;
        [self addGestureRecognizer:longPress];
        [longPress release];

এইভাবে আমি দীর্ঘ প্রেসটি পরিচালনা করি:

-(void)handleLongPress:(UILongPressGestureRecognizer*)recognizer{
    NSLog(@"double oo");
}

আমি যখন 2 সেকেন্ডের চেয়ে বেশি সময় ধরে চাপ দিই তখন "ডাবল oo" পাঠ্যটি দু'বার মুদ্রিত হয়। কেন? আমি কিভাবে ঠিক করতে পারি?

উত্তর:


684

UILongPressGestureRecognizer একটি ক্রমাগত ইভেন্ট শনাক্তকারী। এই ইভেন্টের শুরু, মাঝামাঝি বা শেষ কিনা তা দেখতে আপনাকে রাষ্ট্রের দিকে নজর দিতে হবে এবং সেই অনুসারে কাজ করুন। অর্থাত্ আপনি শুরু করার পরে সমস্ত ইভেন্ট ফেলে দিতে পারেন, বা কেবল আপনার প্রয়োজন অনুসারে চলতে পারেন। থেকে ক্লাস রেফারেন্স :

দীর্ঘ-প্রেস অঙ্গভঙ্গি অবিরত। অঙ্গভঙ্গিটি শুরু হয় (UIGestureRecognizerStateBegan) যখন অনুমোদিত সময়কালের জন্য সংখ্যা (নাম্বার অফট্যাচসপ্রায়ারড) চাপ দেওয়া হয় এবং স্পর্শগুলি চলনযোগ্য (অনুমোদিতযোগ্য মোভমেন্ট) এর অনুমোদিত পরিসীমা ছাড়িয়ে যায় না। অঙ্গুলি শনাক্তকারী যখনই কোনও আঙুল সরিয়ে নিয়ে যায় তখন পরিবর্তন স্থিতিতে রূপান্তর করে এবং যখন কোনও আঙুল উত্তোলন করা হয় তখন এটি শেষ হয় (UIGestureRecognizerStateEnded)।

এখন আপনি এই মত রাজ্য ট্র্যাক করতে পারেন

-  (void)handleLongPress:(UILongPressGestureRecognizer*)sender { 
    if (sender.state == UIGestureRecognizerStateEnded) {
      NSLog(@"UIGestureRecognizerStateEnded");
    //Do Whatever You want on End of Gesture
     }
    else if (sender.state == UIGestureRecognizerStateBegan){
       NSLog(@"UIGestureRecognizerStateBegan.");
   //Do Whatever You want on Began of Gesture
     }
  }

4
পরবর্তী উত্তর নীচে এটি কীভাবে করা যায় তা দেখায় তবে এর বিস্তারিত ব্যাখ্যা এবং ডকুমেন্টেশনের লিঙ্কের কারণে আমি এই উত্তরটি +1 দিয়েছি।
ম্যাট কনলি

2
কেবলমাত্র ডকুমেন্টেশনের সাথে লিঙ্ক না করে কোড উদাহরণ সহ আরও সহায়ক হতে পারে। আমি নীচে আমার কোড স্নিপেট পোস্ট করেছি। ইউআইজিস্টারআর সনাক্তকারী স্টেটবেগান রাজ্যটি পরীক্ষা করুন।
পল সোল্ট

UIGestureRecognizerStateChanged
Rajneesh071

@joelm তুমি আমাকে) সংরক্ষিত
ইভজেনি Kleban

সুইফট 4 এর জন্য: যদি (সেন্ডার.স্টেট == ইউআইটিএপজেস্টাররেকগনাইজার.সেটেট.েন্ডেড) G // ইঙ্গিত প্রিন্টের শেষে আপনি যা চান তা করুন ("\ n * দীর্ঘকালীন * \ n")}
রবি

117

ইউআইএলংপ্রেসপেশারআরকনগাইজারের অবস্থা পরীক্ষা করতে কেবল নির্বাচক পদ্ধতিতে একটি বিবৃতি যুক্ত করুন:

- (void)handleLongPress:(UILongPressGestureRecognizer *)sender {    
    if (sender.state == UIGestureRecognizerStateEnded) {
        NSLog(@"Long press Ended");
    } else if (sender.state == UIGestureRecognizerStateBegan) {
        NSLog(@"Long press detected.");
    }
}

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

2
শীর্ষ মন্তব্যটি যা বলে তার সাথে মানিয়ে নিতে কারও কারও অবশ্যই সেই উত্তরটি সম্পাদনা করা উচিত। যেহেতু এটি দাঁড়িয়ে আছে কোডটি কাজ করে না।
ডিক্লান ম্যাককেনা

75

আপনাকে যথাযথ অবস্থা পরীক্ষা করতে হবে, কারণ প্রতিটি রাজ্যের জন্য আলাদা আচরণ রয়েছে beha সম্ভবত আপনার UIGestureRecognizerStateBeganসাথে রাজ্যের প্রয়োজন হবে UILongPressGestureRecognizer

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]
                                             initWithTarget:self 
                                             action:@selector(handleLongPress:)];
longPress.minimumPressDuration = 1.0;
[myView addGestureRecognizer:longPress];
[longPress release];

...

- (void)handleLongPress:(UILongPressGestureRecognizer *)gesture {
    if(UIGestureRecognizerStateBegan == gesture.state) {
        // Called on start of gesture, do work here
    }

    if(UIGestureRecognizerStateChanged == gesture.state) {
        // Do repeated work here (repeats continuously) while finger is down
    }

    if(UIGestureRecognizerStateEnded == gesture.state) {
        // Do end work here when finger is lifted
    }
}

2
দেখে মনে হচ্ছে রাষ্ট্র পরিবর্তনের জন্য আপনার আঙ্গুলগুলি সরিয়ে নিতে হবে; এটা কি ঠিক?
আর্কডিয়ান

আশেপাশে আঙ্গুলগুলি সরানোর সময় এটি স্টেটচ্যাঞ্জডকে ট্রিগার করতে পারে, এটি আমার পরীক্ষার কোডে যা করছিল তার অনুরূপ শোনাচ্ছে।
পল সোল্ট

ইউআইজিস্টারআরকনাইজার স্টেটবেগানকে কেবল একবার ডাকা হবে বলে মনে হচ্ছে যা আমার পরিস্থিতিটি একটি বোতামে দীর্ঘ প্রেস সনাক্তকরণে একটি ডায়ালগ দেখানোর চেষ্টা করার জন্য উপযুক্ত। অন্যান্য রাজ্য একাধিকবার কল করা হয়। ধন্যবাদ!
দামিয়ান

19

শুধু এটি চেষ্টা করুন:

উদ্দেশ্য গ

- (void)handleLongPress:(UILongPressGestureRecognizer*)sender { 
    if (sender.state == UIGestureRecognizerStateEnded) {
        NSLog(@"Long press Ended");
    } else if (sender.state == UIGestureRecognizerStateBegan) {
        NSLog(@"Long press detected.");
    }
}

সুইফট ২.২:

func handleLongPress(sender:UILongPressGestureRecognizer) {

        if (sender.state == UIGestureRecognizerState.Ended) {
            print("Long press Ended");
        } else if (sender.state == UIGestureRecognizerState.Began) {
            print("Long press detected.");
        }
}

14

এটি সুইফটে কীভাবে পরিচালনা করবেন তা এখানে:

func longPress(sender:UILongPressGestureRecognizer!) {

        if (sender.state == UIGestureRecognizerState.Ended) {
            println("Long press Ended");
        } else if (sender.state == UIGestureRecognizerState.Began) {
            println("Long press detected.");
        }
}

13

সুইফট 3.0:

func handleLongPress(sender: UILongPressGestureRecognizer) {

    if sender.state == .ended {
        print("Long press Ended")
    } else if sender.state == .began {
        print("Long press detected")
    }

6

আপনার অঙ্গভঙ্গি হ্যান্ডলার প্রতিটি অঙ্গভঙ্গির জন্য কল গ্রহণ করে। সুতরাং আপনাকে প্রতিটি রাজ্যের জন্য একটি চেক লাগাতে হবে এবং আপনার কোডটি প্রয়োজনীয় অবস্থায় রাখতে হবে।

যদি অবশ্যই অন্যথায় সুইচ-কেস ব্যবহার করা পছন্দ করে তবে:

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]
                                         initWithTarget:self 
                                         action:@selector(handleLongPress:)];
    longPress.minimumPressDuration = 1.0;
    [myView addGestureRecognizer:longPress];
    [longPress release];

-(void)handleLongPress:(UILongPressGestureRecognizer *)gesture {
        switch(gesture.state){
          case UIGestureRecognizerStateBegan:
               NSLog(@"State Began");
               break;
          case UIGestureRecognizerStateChanged:
               NSLog(@"State changed");
               break;
          case UIGestureRecognizerStateEnded:
               NSLog(@"State End");
               break;
          default:
               break;
         }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.