আপনি কি একাধিক দর্শনগুলির সাথে একটি ইউআইজিস্টারআর সনাক্তকারী সংযুক্ত করতে পারেন?


228
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapTapTap:)];
[self.view1 addGestureRecognizer:tapGesture];
[self.view2 addGestureRecognizer:tapGesture];
[tapGesture release];

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

উত্তর:


334

একটি UIGestureRecognizerএকটি একক দৃশ্য সঙ্গে ব্যবহার করা যেতে পারে। আমি ডকুমেন্টেশন দোষযুক্ত একমত। এর UIGestureRecognizerএকক viewসম্পত্তি এটিকে দেয়:

দৃশ্য

অঙ্গভঙ্গি শনাক্তকারী দর্শনটির সাথে সংযুক্ত। (শুধুমাত্র পাঠযোগ্য)

@ প্রপার্টি (ননোটমিক, রিডোনলি) ইউআইভিউ * ভিউ

আলোচনা আপনি অ্যাডজেস্টারআর সনাক্তকারী: পদ্ধতিটি ব্যবহার করে কোনও অঙ্গভঙ্গি সনাক্তকারীকে একটি ইউআইভিউ অবজেক্টে সংযুক্ত (বা যুক্ত) করুন।


11
কারণ কোনও দৃশ্যে একটি অঙ্গভঙ্গি সনাক্তকারী যুক্ত করা রানটাইম (বনাম সংকলনের সময়) এ ঘটে।
টমসউইফ্ট

1
আমি এটি পেয়েছি, তবে অনেকগুলি সনাক্ত করার মতো বলে যে আমরা কোনও ভেরিয়েবল ব্যবহার করি নি, এক্সকোড কোডটির ভিত্তিতে বলতে পারত যে আমরা একই স্বীকৃতিটিকে একাধিক দর্শনে পাস করেছি এবং কোডারকে সতর্ক করতে পারি।
জোল্টন ম্যাটেক

1
একই UITapGestureR সনাক্তকারীকে নির্ধারিত একাধিক দর্শন সম্পর্কে সংকলক সতর্কতা বোকামি, কারণ আপনি এটি উদ্দেশ্য হিসাবে করতে চাইতে পারেন, উদাহরণস্বরূপ যদি আপনি টোকা অঙ্গভঙ্গি শনাক্তকারীকে এক ভিউ থেকে অন্য দর্শনে সরিয়ে নিতে চান। এটি বলেছিল, এটি একটি নির্বোধ সীমাবদ্ধতা যা অঙ্গভঙ্গি সনাক্তকারীকে একাধিক মতামত ব্যবহার করা যায় না।
এরিক ভ্যান ডের নিউট

1
আইওএস 9 এখন অঙ্গভঙ্গি সনাক্তকারী হিসাবে একক ভিউ প্রয়োগ করে, আমি নীচে ইন্টারফেস নির্মাতা পদ্ধতিটি ব্যবহার করছিলাম তবে এখন আমি নীচের বার্তাটি ব্যবহার করার চেষ্টা করব (বংশবৃদ্ধির জন্য কিছু বিশদ কাটা): সতর্কতা: একটি অঙ্গভঙ্গি সনাক্তকারী (< UITapGestureR সনাক্তকারী: .....>) একাধিক দর্শন (-> <ইউআইভিউ:; ফ্রেম = (0 44; 600 536); অটোরাইজ = আরএম + বিএম; অঙ্গভঙ্গি সনাক্তকারীসমূহ <<< যোগ করার জন্য স্টোরিবোর্ডে / xib এ সেটআপ করা হয়েছিল < NSArray ...:>; স্তর = <ক্যালায়ার: ... >>) এক সময়, এটি কখনও অনুমোদিত ছিল না এবং এখন তা প্রয়োগ করা হয়েছে। আইওএস 9.0 দিয়ে শুরু করে এটিকে প্রথম দর্শনে লোড করা হবে।
জর্জ ব্রাউন

আপনি যদি দ্বিতীয় বার দেখার জন্য যোগ করেন তবে এই স্বীকৃতিদাতা স্বয়ংক্রিয়ভাবে সংযুক্ত না হয়ে যাবার আগে ভিউটি সংযুক্ত করা হয়েছিল UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didPressed:)]; [self.view1 addGestureRecognizer:tapRecognizer]; [self.view2 addGestureRecognizer:tapRecognizer];আউটপুট ভিউ 1 এর কোনও অঙ্গভঙ্গি শনাক্তকারী অ্যারে নেই;
ভিউ

48

আমি নীচে ব্যবহার করে এটি কাছাকাছি পেয়েছিলাম।

for (UIButton *aButton in myButtons) {

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

}

তারপরে আমার হ্যান্ডেললংপ্রেস পদ্ধতিতে আমি কেবল ইশারা শনাক্তকারীর দর্শনের সমান একটি UIButton সেট করেছি এবং সেই বোতামটির উপর ভিত্তি করে আমি কী করব

- (void)handleLongPress:(UILongPressGestureRecognizer*)gesture {
    if ( gesture.state == UIGestureRecognizerStateEnded ) {
        UIButton *whichButton=(UIButton *)[gesture view];
        selectedButton=(UIButton *)[gesture view];
    ....
}

1
দুর্দান্ত উত্তর। একটি টন ধন্যবাদ। "যদি আপনি কোনও ইউআইজিস্টারআর সনাক্তকারীকে একাধিক দর্শনের সাথে সংযুক্ত করেন তবে" যদি এই প্রশ্নটি গ্রহণযোগ্য উত্তর হতে পারে?
D_D

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

এটি সত্যিই দুর্দান্ত উত্তর এবং সত্যই সহায়ক এবং @ মাইক্রো +1
দিলিপ

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

1
অন্য কেউ নিশ্চিত করতে পারেন যে এটি আর ওজেজে-সি / সুইফটের বর্তমান সংস্করণে কাজ করে না?
ম্যাক্সি মুস

18

সুইফ্ট 3 এর ক্ষেত্রে যে কারওর প্রয়োজন আছে: উপরের ভাভিক রাঠোদ উত্তরের ভিত্তিতে।

 func setGestureRecognizer() -> UIPanGestureRecognizer {

        var panRecognizer = UIPanGestureRecognizer()

        panRecognizer = UIPanGestureRecognizer (target: self, action: #selector(pan(panGesture:)))
        panRecognizer.minimumNumberOfTouches = 1
        panRecognizer.maximumNumberOfTouches = 1
        return panRecognizer
    }

        ///set the recognize in multiple views
        view1.addGestureRecognizer(setGestureRecognizer())
        view2.addGestureRecognizer(setGestureRecognizer())

3
এটি মূলত দুটি দৃষ্টিভঙ্গির জন্য একাধিক অঙ্গভঙ্গি তৈরি করছে, এখনও একই নিয়ম: প্রতিটি অঙ্গভঙ্গিতে কেবল একটি দৃষ্টিভঙ্গি যুক্ত থাকে
আবদুলারহমান ২

3
না, ফাংশনটি প্রতিবার বলা হওয়ার সাথে একটি ভঙ্গিমা তৈরি করে
আবদুলারহমান

2
ফাংশনের নামটি ভুল। লজিকাল ফাংশন এখানে একটি ক্রিয়াকলাপ হয়। সুতরাং এটির নামকরণ করা উচিত: getGestureRecognizeকারণ এই ফাংশনটি সেটাই করে
ডেভিড

আমার জন্য সুন্দর কাজ! এবং একাধিক ভেরিয়েবল তৈরি করার চেয়ে কোড আরও বেশি পরিষ্কার বা অ্যাডেস্টচারআরকনাইটিজারের অভ্যন্তরে তৈরি করার জন্য পুরো কোডটি রাখুন
কোডেনেটর 8১

11

আমরা এর মতো কিছু করতে পারি, এটি সহজ এবং সহজ

1) আপনার নিয়ামক হিসাবে নীচে হিসাবে ফাংশন তৈরি করুন (এই ফাংশন অঙ্গভঙ্গি সনাক্তকারী ফিরে আসবে)

-(UITapGestureRecognizer*)setRecognizer{
     UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(openProfile)];
     [gestureRecognizer setNumberOfTapsRequired:1];
     return gestureRecognizer;
}

2) এখন একাধিক ভিউতে এই সনাক্তকারীকে সেট করুন

[self.view1 addGestureRecognizer:[self setRecognizer]]; 
[self.view2 addGestureRecognizer:[self setRecognizer]];

আমি যখন ভিউয়ের পরিবর্তে দুটি লেবেল ব্যবহার করি তখন এটি আমার পক্ষে কাজ করে না।
মিহির ওজা

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

অনেক দেরি হয়ে গেছে, ইতোমধ্যে আমি ঠিক করে ফেলেছি। কিন্তু পরামর্শের জন্য ধন্যবাদ. আপনার মন্তব্য স্ট্যাক ব্যবহারকারীদের জন্য সহায়ক হবে। প্রশংসা!
মিহির ওজা

1
আমার ধারণা লাইনটি setNumberOfTapsRequired:1প্রয়োজনীয় নয়
নাভেদ আব্বাস

9

না আপনার একাধিক দৃষ্টিতে অঙ্গভঙ্গি সনাক্তকারীকে সংযুক্ত করা উচিত নয়।

অ্যাপলের ডকুমেন্টেশনে এই স্পষ্ট তথ্য রয়েছে:

অঙ্গভঙ্গি সনাক্তকারীরা একটি দৃশ্যের সাথে সংযুক্ত থাকে

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

আইওএসের জন্য ইভেন্ট হ্যান্ডলিং গাইড - অঙ্গভঙ্গি সনাক্তকারী অ্যাপল বিকাশকারী লাইব্রেরি

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

আপনি যা করতে পারেন তা হ'ল পৃথক অঙ্গভঙ্গি শনাক্তকারীদের আপনি যে মতামতগুলি পর্যবেক্ষণ করতে চান তার সাথে পৃথক অঙ্গভঙ্গি সনাক্তকারী এবং তারা একটি সাধারণ ক্রিয়া ভাগ করতে পারে।


4

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

1) আপনি UIButtons এবং UILabels এর মতো অন্যান্য অবজেক্ট যুক্ত করার মতো আপনি অবজেক্ট লাইব্রেরি থেকে লং প্রেস অঙ্গভঙ্গি সনাক্তকারীকে যুক্ত করতে পারেন।

এখানে চিত্র বর্ণনা লিখুন শুরুতে আমি যেটি ব্যবহার করে শেষ করেছি তা কেবলমাত্র আমি নিয়েছিলাম

2) রেফারেন্সিং আউটলেটগুলিতে সেট করুন UIButtonএবং ফাইলের মালিকের সাথে ক্রিয়াকলাপ প্রেরণ করুন।

এখানে চিত্র বর্ণনা লিখুন

দ্রষ্টব্য: আপনার যদি একাধিক UIButton বা অন্য কোনও অবজেক্ট থাকে তবে আপনার প্রত্যেকটির জন্য পৃথক অঙ্গভঙ্গি শনাক্তকারী প্রয়োজন। আরও তথ্যের জন্য আমার এই প্রশ্নটি দেখুন। লং প্রেসের অঙ্গভঙ্গি সনাক্তকারীকে ভুল ইউআইবাটন ট্যাগ পাওয়া


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

3

আপনার যদি দৃ view় মতামত থাকে তবে আমি আপনাকে এই জাতীয় কিছু করার পরামর্শ দিচ্ছি

[self.view1 addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapTapTap:)]];
[self.view2 addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapTapTap:)]];

এই উপায় একাধিক বিভিন্ন অপ্রয়োজনীয় ভেরিয়েবল হ্রাস করবে


3

অঙ্গভঙ্গি সনাক্তকারীদের সহজেই যুক্ত করতে আপনি দৃশ্যে একটি জেনেরিক এক্সটেনশন তৈরি করতে পারেন। এটি কেবল একটি উদাহরণ তবে এটি দেখতে এরকম হতে পারে

extension UIView {

    func setGestureRecognizer<Gesture: UIGestureRecognizer>(of type: Gesture.Type, target: Any, actionSelector: Selector, swipeDirection: UISwipeGestureRecognizer.Direction? = nil, numOfTaps: Int = 1) {
    let getRecognizer = type.init(target: target, action: actionSelector)

    switch getRecognizer {
    case let swipeGesture as UISwipeGestureRecognizer:
        guard let direction = swipeDirection else { return }
        swipeGesture.direction = direction
        self.addGestureRecognizer(swipeGesture)
    case let tapGesture as UITapGestureRecognizer:
        tapGesture.numberOfTapsRequired = numOfTaps
        self.addGestureRecognizer(tapGesture)
    default:
        self.addGestureRecognizer(getRecognizer)
    }
  }

}

একটি দৃশ্যে একটি 2 টিপ সনাক্তকারী যুক্ত করতে আপনি কেবল কল করবেন:

let actionSelector = #selector(actionToExecute)
view.setGestureRecognizer(of: UITapGestureRecognizer.self, target: self, actionSelector: actionSelector, numOfTaps: 2)

আপনি সহজেই একটি সোয়াইপ শনাক্তকারী যুক্ত করতে পারেন

view.setGestureRecognizer(of: UISwipeGestureRecognizer.self, target: self, actionSelector: actionSelector, swipeDirection: .down)

ইত্যাদি। কেবল মনে রাখবেন যে লক্ষ্যটি অবশ্যই নির্বাচকের সাথে সংযুক্ত করা উচিত।


2

' <UIScrollViewDelegate>' দ্বারা শ্রেণিটিকে ওভাররাইড করুন

এবং এম। এম ক্লাসে এই পদ্ধতিটি ব্যবহার করুন:

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

এই পদ্ধতিটি আপনাকে একক দৃশ্যে একাধিক সোয়াইপ সক্ষম করতে সহায়তা করবে ..


2

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

সুইফট 2:

@IBOutlet var topicView: [UIView]!

override func viewDidLoad() {
        for view in self.topicView as [UIView] {
        view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "viewClicked:"))
    }
}

func viewClicked(recognizer: UITapGestureRecognizer) {
    print("tap")
}

-6

আপনি এই কোডটি ব্যবহার করে এটি করতে পারেন আমার মতামতগুলি যা xib এর চিত্রদর্শন।

- (void)viewDidLoad
{
    firstIV.tag = 501;
    secondIV.tag = 502;
    thirdIV.tag = 503;
    forthIV.tag = 504;

    [self addTapGesturetoImageView: firstIV];
    [self addTapGesturetoImageView: secondIV];
    [self addTapGesturetoImageView: thirdIV];
    [self addTapGesturetoImageView: forthIV];
}

-(void)addTapGesturetoImageView:(UIImageView*)iv
{
    iv.userInteractionEnabled = YES;
    UITapGestureRecognizer * textfielBGIVTapGasture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(textfielBGIVTapped:)];
    textfielBGIVTapGasture.numberOfTapsRequired = 1;
    [iv addGestureRecognizer:textfielBGIVTapGasture];
}

- (void)textfielBGIVTapped:(UITapGestureRecognizer *)recognizer {
    int tag = recognizer.view.tag-500;
    switch (tag) {
        case 1:
        {
            //firstIV tapped;
            break;
        }
        case 2:
        {
            //secondIV tapped;
            break;
        }
        case 3:
        {
            //thirdIV tapped;
            break;
        }
        case 4:
        {
            //forthIV tapped;
            break;
        }
        default: {
            break;
        }
    }
}

1
আপনি একাধিক অঙ্গভঙ্গি সনাক্তকারী তৈরি করছেন; আমার মূল প্রশ্নটি ছিল একটি একক অঙ্গভঙ্গি শনাক্তকারীকে পুনরায় ব্যবহার করা, যা আপনি করতে পারবেন না।
কুবি

1
500আপনার সমস্ত দর্শনের ট্যাগগুলিতে যোগ করার এবং পরে বিয়োগের 500কী লাভ? কেন আপনি কেবল 1(বা এমনকি 0) এর পরিবর্তে আপনার ট্যাগগুলি শুরু করবেন না 501?
ma11hew28

@ ম্যাটডিপিস্কোয়েল, আপনি যেটি দিয়ে শুরু করতে চান তা বিবেচ্য নয়, 1আমি এই কোডটি আমার অ্যাপ্লিকেশন থেকে অনুলিপি করেছি যেখানে আমি এটি দিয়ে দিচ্ছি 501। তবে হ্যাঁ 0কোথাও আমি কোথাও পড়েছি যা এর সর্বদা পিতামাতার দৃষ্টিভঙ্গি নির্দেশ করে তাই এটি জটিলতা তৈরি করবে, বিশ্বাস করুন আমি এর মুখোমুখি হয়েছি।
দিলিপ

ডকুমেন্টেশনের মূল পাঠ্যটি হ'ল "ভিউ অঙ্গভঙ্গি সনাক্তকারীটির একটি শক্তিশালী রেফারেন্স স্থাপন করে।" যার অর্থ ভিউ অঙ্গভঙ্গির মালিক। অঙ্গভঙ্গিতে কেবল একজন মালিক থাকতে পারে। লিঙ্কটি
ফ্যান্টম 59
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.