ইউআইএসওয়াইপজেক্টরআরকনগাইজারের জন্য দিকনির্ধারণ সেট করা


132

আমি আমার ভিউ ভিত্তিক আইফোন প্রকল্পে সাধারণ সোয়াইপ অঙ্গভঙ্গি স্বীকৃতি যুক্ত করতে চাই। সমস্ত দিকের অঙ্গভঙ্গিগুলি (ডান, নীচে, বাম, উপরে) স্বীকৃত হওয়া উচিত।

এটি ইউআইএসওয়াইপজেক্টররনগনাইজারের জন্য ডক্সে বলা হয়েছে:

আপনি বিটওয়াইস-ওআর অপরেন্ড ব্যবহার করে একাধিক ইউআইএসওয়াইপজেক্টররনগাইনাইজারডাইরেশন কনস্ট্যান্ট নির্দিষ্ট করে একাধিক দিকনির্দেশ নির্দিষ্ট করতে পারেন। ডিফল্ট দিকনির্দেশটি হ'ল ইউআইএসওয়াইপজেষ্টাররেকজনাইজারডাইরেশন রাইট।

তবে আমার জন্য এটি কাজ করে না। যখন চারটি দিকই OR'ed হয় কেবলমাত্র বাম এবং ডান সোয়াইপগুলি স্বীকৃত।

- (void)viewDidLoad {
    UISwipeGestureRecognizer *recognizer;

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionUp)];
    [[self view] addGestureRecognizer:recognizer];
    [recognizer release]; 
    [super viewDidLoad];
}

-(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer {
    NSLog(@"Swipe received.");
}

আমি দৃশ্যে চারটি শনাক্তকারী যুক্ত করার সাথে এটি সংশোধন করেছি তবে আমি কৌতূহল জানার জন্য কেন এটি ডক্সে বিজ্ঞাপন হিসাবে কাজ করে নি?

- (void)viewDidLoad {
    UISwipeGestureRecognizer *recognizer;

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
    [[self view] addGestureRecognizer:recognizer];
    [recognizer release];

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionUp)];
    [[self view] addGestureRecognizer:recognizer];
    [recognizer release];

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionDown)];
    [[self view] addGestureRecognizer:recognizer];
    [recognizer release];

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
    [[self view] addGestureRecognizer:recognizer];
    [recognizer release];

    [super viewDidLoad];
}

-(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer {
    NSLog(@"Swipe received.");
}

3
এটি সম্পূর্ণরূপে সম্পর্কিত নয়, তবে [সুপার ভিউডিডলোড]; - (অকার্যকর) দর্শনে প্রথম বিবৃতি হওয়া উচিতডিডলড
মিহির মেহতা

উত্তর:


115

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

এর অর্থ হ'ল 1 টিরও বেশি দিকের অনুমতি দেওয়া হলে আসল দিকের জন্য চেকগুলি সর্বদা ব্যর্থ হয়। আপনি যখন নির্বাচক পদ্ধতিতে (যেমন -(void)scrollViewSwiped:(UISwipeGestureRecognizer *)recognizer) 'দিকনির্দেশের মান' আউটপুট করেন তখন আপনি নিজের জন্য এটি সহজেই দেখতে পাবেন ।

অ্যাপলকে একটি বাগ রিপোর্ট (# 8276386) ফাইল করেছেন।

[আপডেট] আমি অ্যাপলের কাছ থেকে উত্তর পেয়েছি যে আচরণটি যেমন ইচ্ছা তেমন কাজ করে।

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

এর অর্থ হ'ল আসল কাজের দিকটি এটি ব্যবহার করার কথা। দিকের সম্পত্তিটি কেবলমাত্র অঙ্গভঙ্গিগুলি সঠিকভাবে স্বীকৃতি পেতে ব্যবহার করা যেতে পারে, তবে স্বীকৃতিটিকে প্রবর্তনকারী প্রকৃত দিকের জন্য তুলনা করার জন্য কোনও সফল স্বীকৃতি হিসাবে সম্পাদিত পদ্ধতিতে নয়।


35
আমি বাজি রাখতে আগ্রহী যে প্রথমে সোয়াইপ অঙ্গভঙ্গি সনাক্তকারী ব্যবহার করে এমন প্রত্যেকে যেদিকে দিকের সম্পত্তিটি কীভাবে কাজ করবে সে সম্পর্কে সঠিক একই ভুল ধারণা তৈরি করে।
স্মারক

নিচু, বাম এবং ডানদিকে সোয়াইপগুলি রেকর্ড করতে 4 টি আলাদা আলাদা সনাক্তকারী তৈরি করা নির্বোধ, তবে আপনি সেখানে আছেন।
স্মারক

বাহ যে কিন্ডা সফল হয়, একটি বিশাল চুক্তি নয় তবে মনে হয় তারা যুক্ত করতে পারে এমন কিছু
মার্চিন্রাম

2
তাদের শিরোনাম ফাইলটি বলে: @ প্রপার্টি (ননোটমিক) ইউআইএসওয়াইপ গেস্টচার রিকনগাইজার দিকনির্দেশ; // ডিফল্ট হ'ল ইউআইএসওয়াইপজেক্টররেকগনিজারডাইরেশন রাইট। সোয়াইপগুলির কাঙ্ক্ষিত দিক। একাধিক দিকনির্দেশ নির্দিষ্ট করা যেতে পারে
নিকটমরো

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

25

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


এটিই সঠিক সমাধান। 2 জিআর, একটি উপরে এবং নিচে / বাম এবং ডানদিকে একটি। বিঙ্গো!
লোগানকোট্রেল

22

ভাল যে সফল হয়, আমি লারসের মতো 2 টি অঙ্গভঙ্গি যুক্ত করে সমস্যার সমাধান করেছি এবং এটি পুরোপুরি কাজ করেছে ...

1) বাম / ডান 2) উপরে / ডাউন

  

UISwipeGestureRecognizer *swipeLeftRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
    [swipeLeftRight setDirection:(UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft )];
    [self.view addGestureRecognizer:swipeLeftRight];

    UISwipeGestureRecognizer *swipeUpDown = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
    [swipeUpDown setDirection:(UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionDown )];
    [self.view addGestureRecognizer:swipeUpDown];

13
UISwipeGestureRecognizer *recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(didSwipe:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
[self.view addGestureRecognizer:recognizer];
[recognizer release];

recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(didSwipe:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
[self.view addGestureRecognizer:recognizer];
[recognizer release];

এখন এটিডডুইপ ফাংশন

- (void) didSwipe:(UISwipeGestureRecognizer *)recognizer{
      if([recognizer direction] == UISwipeGestureRecognizerDirectionLeft){
          //Swipe from right to left
          //Do your functions here
      }else{
          //Swipe from left to right
          //Do your functions here
      }
 }

5

যদি আপনার এক্সকোড ৪.২ ব্যবহার করে থাকে তবে আপনি স্টোরিবোর্ডে জেচার রিকগনাইজারগুলি যুক্ত করতে পারেন এবং তারপরে জিইউআই অঙ্গভঙ্গি সনাক্তকারীকে আইবিএ-র সাথে যুক্ত করতে পারেন।

আপনি ইউটিলিটি ফলকের অবজেক্ট লাইব্রেরিতে (ডান ফলকের নীচে) অঙ্গভঙ্গি সনাক্তকারীদের সন্ধান করতে পারেন।

তারপরে এটি উপযুক্ত ক্রিয়াতে নিয়ন্ত্রণ-টেনে আনার বিষয়।


5

যদি আপনি এটি চারটি দিক সনাক্ত করতে চান তবে আপনার চারপাশে যেমনটি করেছিলেন তেমন আপনাকে চারটি দৃষ্টান্ত তৈরি করতে হবে।

এখানে কেন : আপনার তৈরি ইউআইএসওয়াইপজেক্টররনগনাইজারের একই উদাহরণটি প্রেরক হিসাবে নির্বাচককে দেওয়া হয়। সুতরাং আপনি যদি এটি চারটি দিক সনাক্ত করতে সেট করেন তবে এটি সত্যই ফিরে আসবে sgr.direction == xxxযেখানে চারটি দিকের মধ্যে যে কোনও একটিতে এক্সএক্সএক্সএক্স is

এখানে একটি বিকল্প কাজের আশেপাশে কম কোড জড়িত (এআরসি ব্যবহারটি ধরে নেওয়া হয়েছে):

for(int d = UISwipeGestureRecognizerDirectionRight; d <= UISwipeGestureRecognizerDirectionDown; d = d*2) {
    UISwipeGestureRecognizer *sgr = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    sgr.direction = d;
    [self.view addGestureRecognizer:sgr];
}

2

ইউআইএসওয়াইপজেকচারআর সনাক্তকারী ব্যবহারের জন্য এখানে একটি কোড নমুনা। মন্তব্যসমূহ নোট করুন।

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    //add gesture recognizer. The 'direction' property of UISwipeGestureRecognizer only sets the allowable directions. It does not return to the user the direction that was actaully swiped. Must set up separate gesture recognizers to handle the specific directions for which I want an outcome.
    UISwipeGestureRecognizer *gestureRight;
    UISwipeGestureRecognizer *gestureLeft;
    gestureRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeRight:)];//direction is set by default.
    gestureLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeLeft:)];//need to set direction.
    [gestureLeft setDirection:(UISwipeGestureRecognizerDirectionLeft)];
    //[gesture setNumberOfTouchesRequired:1];//default is 1
    [[self view] addGestureRecognizer:gestureRight];//this gets things rolling.
    [[self view] addGestureRecognizer:gestureLeft];//this gets things rolling.
}

সোয়াইপাইট এবং সোয়াইপ লেফট হল এমন পদ্ধতি যা আপনি বাম বা ডান সোয়াইপের উপর ভিত্তি করে নির্দিষ্ট ক্রিয়াকলাপ সম্পাদন করতে ব্যবহার করেন। উদাহরণ স্বরূপ:

- (void)swipeRight:(UISwipeGestureRecognizer *)gesture
{
    NSLog(@"Right Swipe received.");//Lets you know this method was called by gesture recognizer.
    NSLog(@"Direction is: %i", gesture.direction);//Lets you know the numeric value of the gesture direction for confirmation (1=right).
    //only interested in gesture if gesture state == changed or ended (From Paul Hegarty @ standford U
    if ((gesture.state == UIGestureRecognizerStateChanged) ||
    (gesture.state == UIGestureRecognizerStateEnded)) {

    //do something for a right swipe gesture.
    }
}

2
UISwipeGestureRecognizer *Updown=[[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(handleGestureNext:)];
            Updown.delegate=self;
            [Updown setDirection:UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionUp];
            [overLayView addGestureRecognizer:Updown];

            UISwipeGestureRecognizer *LeftRight=[[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(handleGestureNext:)];
            LeftRight.delegate=self;
            [LeftRight setDirection:UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight];
            [overLayView addGestureRecognizer:LeftRight];
            overLayView.userInteractionEnabled=NO;


    -(void)handleGestureNext:(UISwipeGestureRecognizer *)recognizer
    {
        NSLog(@"Swipe Recevied");
        //Left
        //Right
        //Top
        //Bottom
    }

2

সুইফট 2.1

আমাকে নিম্নলিখিতটি ব্যবহার করতে হয়েছিল

    for var x in [
        UISwipeGestureRecognizerDirection.Left,
        UISwipeGestureRecognizerDirection.Right,
        UISwipeGestureRecognizerDirection.Up,
        UISwipeGestureRecognizerDirection.Down
    ] {
        let r = UISwipeGestureRecognizer(target: self, action: "swipe:")
        r.direction = x
        self.view.addGestureRecognizer(r)
    }

1

হুম, আশ্চর্যজনক, এটি আমার জন্য নিখুঁত কাজ করে, আমি ঠিক একই জিনিস করি

মনে হয় আপনার তাকানোর চেষ্টা করা উচিত

ইউআইজিস্টারআরকনাইজারডেলিগেট পদ্ধতি

- (BOOL)gestureRecognizerShouldBegin:(UISwipeGestureRecognizer *)gestureRecognizer {
   // also try to look what's wrong with gesture
   NSLog(@"should began gesture %@", gestureRecognizer);
   return YES;
}

লগগুলিতে আপনাকে অবশ্যই এর মতো কিছু দেখতে হবে:

অঙ্গভঙ্গি শুরু করা উচিত; টার্গেট = <(ক্রিয়া = ক্রিয়া forUpDownSwipeGestureRecognizer:, লক্ষ্য =)>; দিক = উপরে, নীচে, বাম, ডান>


কি কাজ করে না? অঙ্গভঙ্গি সনাক্তকারী শল্ডবেগিন: ভাল কাজ করে।
দানিয়াল আয়তেকিন

1

এটি ব্যবহার করুন, এটি বিট অপারেশন হওয়া উচিত

   gesture.direction & UISwipeGestureRecognizerDirectionUp || 
   gesture.direction & UISwipeGestureRecognizerDirectionDown

0

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

আপনার "অ্যাকশন" নির্বাচকটির নাম একাধিক সোয়াইপ অঙ্গভঙ্গি সনাক্তকারীদের জুড়ে যদি একই হয় তবে আইওএস-এ এটি একটি বাগ রয়েছে appears আপনি যদি কেবল তাদের নাম আলাদা করে রাখেন, যেমন হ্যান্ডেল লেফটসুইপফ্রোম এবং হ্যান্ডেল রাইটসুইপফ্রম থেকে, সমস্ত কিছু কাজ করে।

UISwipeGestureRecognizer *recognizer;

recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleLeftSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];

recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleRightSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.