অঙ্গভঙ্গি সনাক্তকারী এবং বোতাম ক্রিয়া


99

আমার কাছে একটি ভিউ হায়ারার্কি রয়েছে যা দেখতে এরকম কিছু দেখাচ্ছে:

UIView (A)
UIView > UIImageView
UIView > UIView (B)
UIView > UIView (B) > Rounded Rect Button
UIView > UIView (B) > UIImageView
UIView > UIView (B) > UILabel

আমি আমার ইউআইভিউ (বি) এর সাথে অঙ্গভঙ্গি সনাক্তকারী (গুলি) সংযুক্ত করেছি। যে সমস্যার মুখোমুখি হচ্ছি তা হ'ল আমি ইউআইভিউ (বি) এর ভিতরে থাকা বৃত্তাকার রেক্ট বোতামটির জন্য কোনও পদক্ষেপ গ্রহণ করি না। সিঙ্গলট্যাপ অঙ্গভঙ্গি সনাক্তকারী বাটনটির টাচ আপ ইনসাইড ইভেন্টটি ক্যাপচার / ওভাররাইড করে।

আমি কীভাবে এটি কাজ করতে পারি? আমি ভেবেছিলাম যে প্রতিক্রিয়াশীল চেইন শ্রেণিবিন্যাস নিশ্চিত করবে যে বোতাম টাচের ইভেন্টটিকে অগ্রাধিকার দেওয়া হবে এবং এটি ট্রিগার হয়ে উঠবে! আমি কী মিস করছি?

এখানে কিছু সম্পর্কিত কোড রয়েছে:

#pragma mark -
#pragma mark View lifecycle (Gesture recognizer setup)

- (void)viewDidLoad {
    [super viewDidLoad];

    // double tap gesture recognizer
    UITapGestureRecognizer *dtapGestureRecognize = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapGestureRecognizer:)];
    dtapGestureRecognize.delegate = self;
    dtapGestureRecognize.numberOfTapsRequired = 2;
    [self.viewB addGestureRecognizer:dtapGestureRecognize];

    // single tap gesture recognizer
    UITapGestureRecognizer *tapGestureRecognize = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureRecognizer:)];
    tapGestureRecognize.delegate = self;
    tapGestureRecognize.numberOfTapsRequired = 1;
    [tapGestureRecognize requireGestureRecognizerToFail:dtapGestureRecognize];
    [self.viewB addGestureRecognizer:tapGestureRecognize];

    // add gesture recodgnizer to the grid view to start the edit mode
    UILongPressGestureRecognizer *pahGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressGestureRecognizerStateChanged:)];
    pahGestureRecognizer.delegate = self;
    pahGestureRecognizer.minimumPressDuration = 0.5;
    [self.viewB addGestureRecognizer:pahGestureRecognizer];

    [dtapGestureRecognize release];
    [tapGestureRecognize release];
    [pahGestureRecognizer release];
}

#pragma mark -
#pragma mark Button actions

- (IBAction)buttonTouchUpInside:(id)sender {
    NSLog(@"%s, %@", __FUNCTION__, sender);
}

#pragma mark -
#pragma mark Gesture recognizer actions


- (void)singleTapGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
    NSLog(@"%s", __FUNCTION__);
}

- (void)doubleTapGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
    NSLog(@"%s", __FUNCTION__);
}

- (void)longPressGestureRecognizerStateChanged:(UIGestureRecognizer *)gestureRecognizer {

    switch (gestureRecognizer.state) {

        case UIGestureRecognizerStateEnded: {
            NSLog(@"%s", __FUNCTION__);

            break;
        }
        default:
            break;
    }
}

সবচেয়ে সহজ উপায় ক্যান্সেলসটচআইনভিউ = মিথ্যা সেট করুন
বাগসফ্লিয়ার

উত্তর:


176

"ShouldReLiveTouch" পদ্ধতিতে আপনার একটি শর্ত যুক্ত করা উচিত যা বোতামে টাচ থাকলে কোনও উত্তরই ফিরে আসবে না।

এটি অ্যাপল সিম্পলগাস্টারআর সনাক্তকারীগুলির উদাহরণ থেকে।

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {

    // Disallow recognition of tap gestures in the segmented control.
    if ((touch.view == yourButton)) {//change it to your condition
        return NO;
    }
    return YES;
}

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

সম্পাদনা করুন

ড্যানিয়েল উল্লেখ করেছেন যে UIGestureRecognizerDelegateএটি কাজ করার জন্য আপনাকে অবশ্যই মেনে চলতে হবে।

শনি


4
আহ !!! হ্যাঁ, আমি এই -পাস্টারর সনাক্তকারীকে ভুলে গিয়েছিলাম: রিসিপট্যাচ: পদ্ধতি। আমাকে সঠিক দিকে নির্দেশ করার জন্য ধন্যবাদ। যদিও এটি আমার সমস্যা সমাধান করে তবে আমি এখনও জানি না কেন উত্তরদাতা শ্রেণিবদ্ধি এই ক্ষেত্রে কাজ করছে না। এটি সম্ভবত হওয়া উচিত, তবে এটি অ্যাপল দ্বারা পরিচালিত হচ্ছে না।
মোস্তফা

4
ইউআইজিস্টচারআর সনাক্তকারী আচরণটি পরিষ্কারভাবে "স্বাভাবিক" প্রতিক্রিয়াশীল চেইন থেকে পৃথক হিসাবে বর্ণিত। এটি অ্যাপলের একটি নকশার সিদ্ধান্ত।
সিলওয়াইন জি।

11
UIGestureRecognizerDelegate প্রোটোকলের সাথে সামঞ্জস্য রাখতে এবং UIGestureRecognizer এর প্রতিনিধিটিকে সেই বস্তুতে সেট করতে ভুলবেন না।
ড্যানিয়েল

4
বিস্তৃত ব্যবহারের জন্য, রমেশের বা ফ্লাইপিগের পরীক্ষার ধারাগুলিতে কিছু রূপ বিবেচনা করুন। আমার ক্ষেত্রে, উদাহরণস্বরূপ, আমি এই লাইনটি দিয়ে শেষ করেছি: if ( [touch.view isKindOfClass:[UIControl class]] || [[touch.view superview] isKindOfClass:[UITableViewCell class]] ) {... নোট করুন যে টেবিলভিউ সেলগুলি তাদের কন্টেন্টভিউতে "ছোঁয়া" পেয়েছে, যা একটি প্রাইভেট ক্লাসের সদস্য, সুতরাং সেখানে আমরা তার পরিবর্তে সুপারভিউয়ের ক্লাসটি পরীক্ষা করি।
ক্লোজাচ

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

51

আমারও একই সমস্যা ছিল, তারপরে আমি চেষ্টা করেছিলাম

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{

    if ([touch.view isKindOfClass:[UIButton class]]) {      //change it to your condition
        return NO;
    }
    return YES;
}

এটি এখন নিখুঁতভাবে কাজ করছে .........


4
আমি কেবলমাত্রmyGestureRecognizer.delegate = self;
14: 15 এ জিরো 3nna

20

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

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if (([touch.view isKindOfClass:[UIControl class]])) {
         return NO;
    }
    return YES;
}

দ্রষ্টব্য: এই চেকটি করবেন না (সনাক্তকারী.ভিউ ক্লাসের ধরণটি পরীক্ষা করুন) অঙ্গভঙ্গি সনাক্তকারী শল্ডব্যাগিন, এটি কাজ করবে না।


11

এখানে একটি সুইফ্ট 3.0 সংস্করণ রয়েছে:

extension UIViewController: UIGestureRecognizerDelegate {

public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    if touch.view is UIButton {
        return false
    }
    return true
}

ভুলে যাবেন না:

Make your tapper object delegate to self (e.g: tapper.delegate = self)


6

এখানে একটি সুইফ্ট সংস্করণ রয়েছে:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
    if (touch.view!.isKindOfClass(UIButton)) {
        return false
    }
    return true
}

ভুলে যাবেন না:

  1. আপনাকে শ্রেণি অনুসারে পরিণত করুন UIGestureRecognizerDelegate
  2. আপনার টেপার অবজেক্টকে স্ব-স্ব প্রতিনিধি করুন (যেমন tapper.delegate = self:)

5

নীচে কোড স্নিপেট ব্যবহার করে আমার মনে সর্বোত্তম সমাধানটি হল:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    CGPoint touchLocation = [touch locationInView:self.view];
    return !CGRectContainsPoint(self.menuButton.frame, touchLocation);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.