ইউআইটিএপপেশারআর সনাক্তকারী - এটিকে টাচ ডাউনে কাজ করুন, স্পর্শ করবেন না?


84

আমি যেটির জন্য ট্যাপ ইভেন্টটি ব্যবহার করছি এটি খুব সময় সংবেদনশীল, তাই আমি যদি আগ্রহী তখনই যদি ইউটিআইপিপজেচারচারকনাইজারকে সক্রিয় করা সম্ভব হয় যখন ব্যবহারকারী কেবল স্পর্শ না করে বরং তাদের স্পর্শ করার প্রয়োজন হয় না?


4
এটি যদি সহায়তা করে তবে ইউআইটিউচের একটি টাচ স্টার্টেড পদ্ধতি রয়েছে। কিন্তু এটি অঙ্গভঙ্গি সনাক্তকারী ব্যবহার করছে না, যেমনটি আপনি বলেছিলেন।
ভিকডেভ

উত্তর:


141

আপনার কাস্টম টাচডাউন গেস্টচার রেকগনাইজার সাবক্লাস তৈরি করুন এবং টাচবেগনে অঙ্গভঙ্গি প্রয়োগ করুন:

টাচডাউনগ্যাস্টারআর সনাক্তকারী

#import <UIKit/UIKit.h>

@interface TouchDownGestureRecognizer : UIGestureRecognizer

@end

টাচডাউনগেষ্টারআরকনগাইজার.এম

#import "TouchDownGestureRecognizer.h"
#import <UIKit/UIGestureRecognizerSubclass.h>

@implementation TouchDownGestureRecognizer
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    if (self.state == UIGestureRecognizerStatePossible) {
        self.state = UIGestureRecognizerStateRecognized;
    }
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    self.state = UIGestureRecognizerStateFailed;
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    self.state = UIGestureRecognizerStateFailed;
}


@end

বাস্তবায়ন:

#import "TouchDownGestureRecognizer.h"
    TouchDownGestureRecognizer *touchDown = [[TouchDownGestureRecognizer alloc] initWithTarget:self action:@selector(handleTouchDown:)];
    [yourView addGestureRecognizer:touchDown];

-(void)handleTouchDown:(TouchDownGestureRecognizer *)touchDown{
    NSLog(@"Down");
}

দ্রুত বাস্তবায়ন:

import UIKit
import UIKit.UIGestureRecognizerSubclass

class TouchDownGestureRecognizer: UIGestureRecognizer
{
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent)
    {
        if self.state == .Possible
        {
            self.state = .Recognized
        }
    }

    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent)
    {
        self.state = .Failed
    }

    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent)
    {
        self.state = .Failed
    }
}

এখানে পেস্ট করার জন্য সুইফট বাক্য গঠন:

import UIKit.UIGestureRecognizerSubclass

class SingleTouchDownGestureRecognizer: UIGestureRecognizer {
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
        if self.state == .possible {
            self.state = .recognized
        }
    }
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) {
        self.state = .failed
    }
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent) {
        self.state = .failed
    }
}

মনে রাখবেন যে এটির জন্য একটি ড্রপ-ইন প্রতিস্থাপন UITap। সুতরাং কোডে যেমন ...

func add(tap v:UIView, _ action:Selector) {
    let t = UITapGestureRecognizer(target: self, action: action)
    v.addGestureRecognizer(t)
}

আপনি নিরাপদে পরিবর্তন করতে পারেন ....

func add(hairtriggerTap v:UIView, _ action:Selector) {
    let t = SingleTouchDownGestureRecognizer(target: self, action: action)
    v.addGestureRecognizer(t)
}

পরীক্ষা দেখায় এটি একাধিকবার বলা হবে না। এটি একটি ড্রপ-ইন প্রতিস্থাপন হিসাবে কাজ করে; আপনি কেবল দুটি কলের মধ্যে অদলবদল করতে পারেন।


10
"UIGestureRecognizerSubclass.h" আমদানির জন্য অতিরিক্ত +1। ভাল লাগল
সেবাস্তিয়ান হোজাস

4
স্পর্শবেগিন, স্পর্শমোভড, স্পর্শযুক্ত পদ্ধতিগুলিতে সুপারকে ডাকা উচিত নয়?
নিউনি

4
@ জেসনসিলবারম্যান আপনি # ইমপোর্ট <ইউআইকিট / ইউআইজিস্টচাররনকনাইজারসুব্লা.স.এস>> ভুলে গেছেন
লে

এটি দিয়ে আপনি কীভাবে ডাবল ট্যাপ প্রয়োগ করবেন?
বাবিকর

4
@ এ্যাটেলুজ আপনার শুরু এবং শেষের জন্য রাষ্ট্র অর্পণ করেছে। তারপরে হ্যান্ডেল অবস্থায় এটি পরীক্ষা করুন check কাস্টম শনাক্তকারী মানে আপনি সবকিছু নিয়ন্ত্রণ করতে পারবেন।
লে সাং

184

কোনও ইউআইএলংপ্রেসপেশারআরকনগাইজার ব্যবহার করুন এবং minimumPressDurationএটি 0 এ সেট করুন It এটি UIGestureRecognizerStateBeganরাষ্ট্রের সময় টাচ ডাউনের মতো কাজ করবে ।

সুইফ্ট 4+ এর জন্য

func setupTap() {
    let touchDown = UILongPressGestureRecognizer(target:self, action: #selector(didTouchDown))
    touchDown.minimumPressDuration = 0
    view.addGestureRecognizer(touchDown)
}

@objc func didTouchDown(gesture: UILongPressGestureRecognizer) {
    if gesture.state == .began {
        doSomething()
    }
}

উদ্দেশ্য-সি জন্য

-(void)setupLongPress
{
   self.longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(didLongPress:)];
   self.longPress.minimumPressDuration = 0;
   [self.view addGestureRecognizer:self.longPress];
}

-(void)didLongPress:(UILongPressGestureRecognizer *)gesture
{
   if (gesture.state == UIGestureRecognizerStateBegan){
      [self doSomething];
   }
}

4
লোকদের জন্য যে ইন্টারফেস বিল্ডার (আমাকে) পছন্দ করে, সর্বনিম্ন প্রেসডোরেশনটি আইবিতেও সেট করা যায় (দুর্দান্ত সমাধানের জন্য আপনাকে রবকে ধন্যবাদ জানায়)
টিএমআর

এখানে টাচ আপ সনাক্ত করার কোন উপায় আছে?
CalZone

4
@ কলজোন হ্যাঁ, অঙ্গভঙ্গির রাজ্যের জন্য যাচাই করুনUIGestureRecognizerStateEnded
রব ক্যারাওয়ে

4
একটি দুর্দান্ত কাজ +1। minimumPressDuration0 থো হতে পারে।
ভ্যালেন্টিন রাদু

4
বিপজ্জনক এটি সাধারণত একটি সাধারণ স্পর্শ সহ একাধিকবার বলা যেতে পারে touch
ফ্যাটি

23

সুইফট (সাবক্ল্যাসিং ছাড়াই)

এখানে রব ক্যারাওয়ের উদ্দেশ্য-সি উত্তরের অনুরূপ একটি সুইফ্ট সংস্করণ রয়েছে ।

ধারণাটি হ'ল একটি টেপা অঙ্গভঙ্গি শনাক্তকারী minimumPressDurationব্যবহার না করে শূন্যের সেট দিয়ে একটি দীর্ঘ প্রেস অঙ্গভঙ্গি সনাক্তকারী ব্যবহার করুন। এটি হ'ল দীর্ঘ প্রেস অঙ্গভঙ্গি শনাক্তকরণের প্রতিবেদনে স্পর্শ শুরু হওয়া ইভেন্টগুলি টেপ ইশারাটি না করে।

import UIKit
class ViewController: UIViewController {

    @IBOutlet weak var myView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Add "long" press gesture recognizer
        let tap = UILongPressGestureRecognizer(target: self, action: #selector(tapHandler))
        tap.minimumPressDuration = 0
        myView.addGestureRecognizer(tap)
    }

    // called by gesture recognizer
    @objc func tapHandler(gesture: UITapGestureRecognizer) {

        // handle touch down and touch up events separately
        if gesture.state == .began {
            // do something...
            print("tap down")
        } else if gesture.state == .ended { // optional for touch up event catching
            // do something else...
            print("tap up")
        }
    }
}

4
@ রিচি, এটি আমার কাছেও হ্যাকের মতো কিছুটা অনুভূত হয়েছিল, যেহেতু নামটি দীর্ঘ চাপের অঙ্গভঙ্গি সনাক্তকারী, তবে এই পদ্ধতিটি ভিউ সাবক্লাসিংয়ের চেয়ে অনেক সহজ এবং আপনি যেমন বলেছিলেন, এটি দুর্দান্ত কাজ করে।
সুরগাচ

এই সমাধানটি ইউআইস্ক্রোলভিউ সাবক্লাসগুলিতে স্ক্রোলিং সমস্যার কারণ ঘটায়
স্পেটাল

আমি মনে করি বাটার পদ্ধতির কাস্টম অঙ্গভঙ্গি সনাক্তকারী
স্পেটাল

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

4
@ ল্যান্স সামারিয়া, আপনার যদি কেবল ট্যাপ করার চেয়ে আরও জটিল স্পর্শের স্বীকৃতি প্রয়োজন তবে আমি একটি কাস্টম অঙ্গভঙ্গি সনাক্তকারী ব্যবহার করব would
সুরগাচ

1

এটি অন্য একটি সমাধান। UIControl এর সাবক্লাস তৈরি করুন। আপনি স্টোরিবোর্ডেও এটি ইউআইভিউয়ের মতো ব্যবহার করতে পারেন কারণ ইউআইসিএন্ট্রোলটি ইউআইভিউর সাবক্লাস।

class TouchHandlingView: UIControl {
}

এবং এটিতে যুক্ত করুন:

@IBOutlet weak var mainView: TouchHandlingView!
...

mainView.addTarget(self, action: "startAction:", forControlEvents: .TouchDown)
...

তারপরে মনোনীত পদক্ষেপটি ইউআইবাটনের মতো কল করা হবে:

func startAction(sender: AnyObject) {
    print("start")
}

1

আমার দৃশ্যের একটি চুল ট্রিগার রাখার সক্ষমতা প্রয়োজন যাতে এটি টেপ হওয়ার সাথে সাথে এটি সাড়া দেয়। উভয় @ এলএএসএং উত্তর ব্যবহার করে কাজ করেছে এবং তাই @ রবকারাওয়ে উত্তর ব্যবহার করে । উভয় জবাব দিয়ে আমি যে সমস্যার মধ্যে পড়েছিলাম তা হ'ল আমি সোয়াইপগুলি সনাক্ত করার ক্ষমতা হারিয়ে ফেলেছিলাম। সোয়াইপ করার সময় আমার ঘোরানোর জন্য আমার ভিউ দরকার ছিল তবে আমার আঙুলটি ভিউটি স্পর্শ করার সাথে সাথে কেবলমাত্র ট্যাপটি সনাক্ত করা গেল। টেপ সনাক্তকারী খুব সংবেদনশীল ছিল এবং একটি ট্যাপ এবং একটি সোয়াইপের মধ্যে পার্থক্য করতে পারে না।

এই উত্তর এবং এই উত্তরের সাথে মিলিত আমিই @ এলএএসএং উত্তর ভিত্তিক অফ নিয়ে এসেছি

আমি প্রতিটি ইভেন্টে 6 টি মন্তব্য রেখেছি।

import UIKit.UIGestureRecognizerSubclass

class SingleTouchDownGestureRecognizer: UIGestureRecognizer {


    var wasSwiped = false

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {

        guard let view = self.view else { return }
        guard let touches = event.touches(for: view) else { return } // 1. compare that event in touchesBegan has touches for the view that is the same as the view to which your gesture recognizer was assigned

        if touches.first != nil {
            print("Finger touched!") // 2. this is when the user's finger first touches the view and is at locationA
            wasSwiped = false // 3. it would seem that I didn't have to set this to false because the property was already set to false but for some reason when I didn't add this it wasn't responding correctly. Basically set this to false
        }
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) {

        guard let touch = touches.first else { return }

        let newLocation = touch.location(in: self.view)
        let previousLocation = touch.previousLocation(in: self.view)

        if (newLocation.x > previousLocation.x) || (newLocation.x < previousLocation.x) {
            print("finger touch went right or left") // 4. when the user's finger first touches it's at locationA. If the the user moves their finger to either the left or the right then the finger is no longer at locationA. That means it moved which means a swipe occurred so set the "wasSwiped" property to true

            wasSwiped = true // 5. set the property to true because the user moved their finger
        }
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent) {
        print("finger is no longer touching.") // 6. the user has lifted their finger off of the view. If "wasSwiped" is true then ".fail" but if it wasn't swiped then ".recognize"

        if wasSwiped {
            self.state = .failed
        } else {
            self.state = .recognized
        }
    }
}

এবং এটি ব্যবহার করতে যাতে এটি ব্যবহার করে তা চুলের ট্রিগার প্রতিক্রিয়া এবং বাম এবং ডানদিকে সোয়াইপ অঙ্গভঙ্গি পেয়েছে:

let tapGesture = SingleTouchDownGestureRecognizer(target: self, action: #selector(viewWasTapped(_:)))
myView.addGestureRecognizer(tapGesture)

let rightGesture = UISwipeGestureRecognizer(target: self, action: #selector(respondToSwipeGesture(recognizer:)))
rightGesture.direction = .right
myView.addGestureRecognizer(rightGesture)

let leftGesture = UISwipeGestureRecognizer(target: self, action: #selector(respondToSwipeGesture(recognizer:)))
leftGesture.direction = .left
myView.addGestureRecognizer(leftGesture)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.