আমি কীভাবে কোনও ইউআইআইমেজভিউয়ের স্পর্শ ইভেন্টটি সনাক্ত করতে পারি?


97

আমি নেভিগেশন বারে একটি চিত্র (ইউআইআইমেজভিউ) রেখেছি। এখন আমি স্পর্শ ইভেন্টটি সনাক্ত করতে এবং ইভেন্টটি পরিচালনা করতে চাই। আমি এটা কিভাবে করবো?


এই পরিস্থিতিতে আমি পরিবর্তে একটি কাস্টম UIButton ব্যবহার করব (এবং মনে করি আপনার উচিত)।
টাইটানিয়ামডেকয়

পরীক্ষা করে দেখুন সুইফট সংস্করণ উত্তর http://stackoverflow.com/a/41328885/3177007
মোহাম্মদ Jaleel নাজির

উত্তর:


138

ব্যবহারিক দিক থেকে, এটি করবেন না।

পরিবর্তে ইউআইআইমেজভিউতে কাস্টম শৈলীর সাথে একটি বোতাম যুক্ত করুন (আপনি চিত্রগুলি নির্দিষ্ট না করে কোনও বোতাম গ্রাফিক্স পাবেন না)। তারপরে আপনি যে পদ্ধতিতে কল করতে চান তা সংযুক্ত করুন।

আপনি সেই কৌশলটি অনেক ক্ষেত্রেই ব্যবহার করতে পারেন যেখানে আপনি সত্যিই চান পর্দার কোনও অঞ্চল টাচ স্টাফের সাথে গোলযোগ না করে বাটন হিসাবে কাজ করতে।


আমি নেভিগেশন বারে একটি বোতাম যুক্ত করেছি এবং আমি স্পর্শ ইভেন্টগুলি পরিচালনা করতে পারি। তবে আমি এই বোতামটিতে একটি বৃত্তাকার চিত্র যুক্ত করতে চাই। আপনি কি আমাকে জানাতে পারেন আমি কীভাবে প্রোগ্রামটিমে এটি করতে পারি? এছাড়াও, আপনি কি আমাকে জানাতে পারেন যে আমি কীভাবে প্রোগ্রামটিমে "কাস্টম" এ বোতামের সম্পত্তি সেট করতে পারি?
ebaccount

UIButton এর জন্য ডকগুলি দেখুন - আপনাকে একটি নিয়ন্ত্রণ রাষ্ট্রের জন্য ব্যাকগ্রাউন্ড চিত্র সেট করতে হবে, আপনি সাধারণ বনাম সিলেক্টেড / হাইলাইটেডের জন্য বিভিন্ন চিত্র চাইবেন। বোতাম শৈলীটি আপনি ইউআইবাটন স্টাইলকাস্টমকে সেট করেছেন, আমি বিশ্বাস করি - আবারও, ইউআইবাটনে স্টাইলের সম্পত্তিটির জন্য ডকগুলি দেখুন।
কেন্ডল হেলস্টেটার জেলনার 14'09

4
ইউআইআইমেজভিউয়ের শীর্ষে কিছুটা উপরে থেকে কোনও ইউআইবটন যুক্ত করছে না? আপনি একটি অতিরিক্ত অবজেক্ট যুক্ত করছেন, যেখানে আপনি ইতিমধ্যে বিদ্যমান ইউআইআইমেজভিউ অবজেক্টের স্পর্শ পদ্ধতিগুলি প্রয়োগ করতে পারবেন। না?
সামওয়ারমেট

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

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

115

UIImageViewথেকে উদ্ভূত UIViewযা এ থেকে নেওয়া হয়েছে UIResponderতাই এটি স্পর্শ ইভেন্টগুলি পরিচালনা করতে প্রস্তুত। আপনি প্রদান করতে চাইবেন touchesBegan, touchesMovedএবংtouchesEnded পদ্ধতি এবং ব্যবহারকারী ইমেজ taps যদি তারা নামক পাবেন। আপনি যা চান তা যদি কোনও ট্যাপ ইভেন্ট হয় তবে কেবলমাত্র একটি বোতামের চিত্র হিসাবে সেট করা চিত্রের সাথে একটি কাস্টম বোতাম ব্যবহার করা সহজ। তবে আপনি যদি ট্যাপস, চালগুলি ইত্যাদির উপর সূক্ষ্ম-শস্য নিয়ন্ত্রণ করতে চান তবে এই উপায়।

আপনি আরও কয়েকটি জিনিস দেখতে চাইবেন:

  • ওভাররাইড canBecomeFirstResponderএবং হ্যাঁ প্রত্যাবর্তন করুন যে চিত্রটি স্পর্শ ইভেন্টগুলির কেন্দ্রবিন্দুতে পরিণত হতে পারে (ডিফল্ট কোনও হয় না)।

  • userInteractionEnabledসম্পত্তিটি হ্যাঁ সেট করুন । এর জন্য ডিফল্ট UIViewsহ্যাঁ হ্যাঁ, তবে UIImageViewsএটি কোনও নয় তাই আপনাকে স্পষ্টভাবে এটি চালু করতে হবে।

  • আপনি যদি মাল্টি টাচ ইভেন্টগুলিতে প্রতিক্রিয়া জানাতে চান (যেমন চিমটি, জুম ইত্যাদি) আপনি multipleTouchEnabledYES এ সেট করতে চাইবেন ।


আমি চেষ্টা করেছিলাম কিন্তু কখনই আমি টাচব্যাগনের অনুষ্ঠানগুলি গ্রহণ করি না ... কেন?
মার্কাস

5
@ মারকাস: আমারও একই সমস্যা ছিল, তবে userInteractionEnabledআমার পিতামাতার দৃশ্যে হ্যাঁ সেট করে এটি ঠিক করেছি । স্ট্যাকওভারফ্লো.com
ড্রুস

51

কোনও ইউআইআইমেজভিউতে একটি স্পর্শ ইভেন্ট যুক্ত করতে, আপনার .m ফাইলে নিম্নলিখিতটি ব্যবহার করুন:

UITapGestureRecognizer *newTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myTapMethod)];

[myImageView setUserInteractionEnabled:YES];

[myImageView addGestureRecognizer:newTap];


-(void)myTapMethod{
    // Treat image tap
}

userInterationEnabled = সত্যটি সেই অংশটি যা ভুলে যাওয়া সহজ, ধন্যবাদ।
মাইকেল পিটারসন

23

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

    UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc]
                                            initWithTarget:self action:@selector(handleSwipe:)];
    swipeRight.direction = UISwipeGestureRecognizerDirectionRight;
    [imgView_ addGestureRecognizer:swipeRight];        
    [swipeRight release];
    UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc]
                                            initWithTarget:self action:@selector(handleSwipe:)];
    swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
    [imgView_ addGestureRecognizer:swipeLeft];
    [swipeLeft release];


13

আমি গত কয়েক ঘন্টা ধরে আমার সমস্যার সমাধান পেতে চেষ্টা করেছি, কোনও লাভ হয়নি different আমি দেখতে পাচ্ছি যে অনেক বিকাশকারীরা এই সমস্যাটি ভাগ করে নিয়েছেন এবং আমি মনে করি এখানকার লোকেরা এ সম্পর্কে জানেন। এ এর ভিতরে আমার একাধিক চিত্র রয়েছেUIScrollView , সেগুলিতে ট্যাপ ইভেন্টগুলি পাওয়ার চেষ্টা করছি।

আমি কোনও থেকে কোনও ইভেন্ট পাচ্ছি না UIImangeView, তবে আমি UILableএটির সাথে মিল রেখে খুব একই ধরণের পরামিতিগুলির সাথে একটি অনুরূপ থেকে একটি ইভেন্ট পাচ্ছি। আইওএস 5.1 এর অধীনে।

আমি ইতিমধ্যে নিম্নলিখিতগুলি সম্পন্ন করেছি:

  1. setUII छविভিউ এবং পিতামাতার দর্শন উভয়ের জন্য setUserInterationEE সক্ষম করুন ES
  2. YES এর জন্য সেট মাল্টিপলটিচআল্টি সেট করুন UIImageView
  3. সাবক্লাসিংয়ের চেষ্টা করা হয়েছে, কোনওরকম UIImageViewসাহায্য করেনি।

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

UIImageView *single_view = [[UIImageView alloc]initWithFrame:CGRectMake(200, 200, 100, 100)];
single_view.image = img;
single_view.layer.zPosition = 4;

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureCaptured:)];
[single_view addGestureRecognizer:singleTap];
[single_view setMultipleTouchEnabled:YES];
[single_view setUserInteractionEnabled:YES];
[self.myScrollView addSubview:single_view];
self.myScrollView.userInteractionEnabled = YES;

UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
testLabel.backgroundColor = [UIColor redColor];
[self.myScrollView addSubview:testLabel];
[testLabel addGestureRecognizer:singleTap];
[testLabel setMultipleTouchEnabled:YES];
[testLabel setUserInteractionEnabled:YES];
testLabel.layer.zPosition = 4;

এবং পদ্ধতিটি যা ইভেন্টটি পরিচালনা করে:

- (void)singleTapGestureCaptured:(UITapGestureRecognizer *)gesture
{
    UIView *tappedView = [gesture.view hitTest:[gesture locationInView:gesture.view] withEvent:nil];
    NSLog(@"Touch event on view: %@", [tappedView class]);
}

যেমনটি বলা হয়েছে, লেবেলের ট্যাপটি গৃহীত হয়েছে।


6

স্পর্শযোগ্য ইউআইআইমেজভিউটি তৈরির পরিবর্তে এটি নাবারটিতে স্থাপনের পরিবর্তে আপনার কেবল একটি ইউআইবারবারটন আইটেম তৈরি করা উচিত যা আপনি একটি ইউআইআইমেজভিউ থেকে তৈরি করেন।

প্রথমে চিত্রটি দেখুন:

UIImageView *yourImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nameOfYourImage.png"]];

তারপরে বারবুটন আইটেমটি আপনার চিত্রের ভিউ থেকে বের করুন:

UIBarButtonItem *yourBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:yourImageView];

তারপরে আপনার নেভিগেশন বারে বার বোতাম আইটেম যুক্ত করুন:

self.navigationItem.rightBarButtonItem = yourBarButtonItem;

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


3

আপনি (বা সাবক্লাস) এর touchesBegan:withEvent:পদ্ধতিটিতে UIViewআপনার UIImageViewসাবউভিউ ধারণ করে ওভাররাইড করতে পারেন ।

এই পদ্ধতির মধ্যে, কোনও UITouchস্পর্শ যদি UIImageViewউদাহরণের সীমানার মধ্যে পড়ে তবে পরীক্ষা করুন (আসুন এটি বলা হয় imageView)।

অর্থাৎ করে CGPointউপাদান [touch locationInView]সঙ্গে ছেদ CGRectউপাদান [imageView bounds]? CGRectContainsPointএই পরীক্ষাটি চালাতে ফাংশনটি সন্ধান করুন ।


আপনার উত্তর দেওয়ার জন্য ধন্যবাদ. আমি এই মতটি যুক্ত করেছি: [নাভবার অ্যাডসুভিউ: স্ব.পিজেম]; // নেভিগেশন বারের একটি সংক্ষিপ্তসার হিসাবে যুক্ত করা হয়েছে। আমি ফাংশনটি ওভাররাইড করেছি কিন্তু ফাংশনটি কখনই ডাকা হয় না। আমি ইউআইআইমেজভিউয়ের সম্পত্তি ইউজার-ইনট্রাকশনএনবল্ড যদিও ইয়েস হিসাবে সেট করেছি। আমি কি কিছু মিস করছি?
ebaccount

স্পর্শগুলি পরীক্ষা করে দেখুন: বিভেন: উইথ এভেন্ট: পদ্ধতি। এটি কীভাবে কাজ করে তার অনুসন্ধান ইঞ্জিনগুলিতে প্রচুর উদাহরণ রয়েছে।
অ্যালেক্স রেনল্ডস

1

প্রথমে আপনার একটি ইউআইবাটন স্থাপন করা উচিত এবং তারপরে হয় আপনি এই বোতামটির জন্য একটি পটভূমি চিত্র যুক্ত করতে পারেন, বা আপনাকে বোতামের উপর একটি ইউআইআইমেজভিউ স্থাপন করতে হবে।

বা:

আপনি কোনও ইউআইআইমেজভিউতে ট্যাপের অঙ্গভঙ্গিটি যুক্ত করতে পারেন যাতে ইউআইআইমেজভিউতে আলতো চাপার সময় ক্লিকের ক্রিয়াটি পাওয়া যায়।


0

আপনারা যারা এই উত্তরের জন্য একটি সুইফট 4 সমাধান খুঁজছেন তাদের জন্য আপনি ইউআইআইমেজভিউতে একটি স্পর্শ ইভেন্ট সনাক্ত করতে নিম্নলিখিতটি ব্যবহার করতে পারেন।

let gestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageViewTapped))
imageView.addGestureRecognizer(gestureRecognizer)
imageView.isUserInteractionEnabled = true

এরপরে আপনাকে আপনার নির্বাচককে নিম্নলিখিত হিসাবে সংজ্ঞায়িত করতে হবে:

@objc func imageViewTapped() {
    // Image has been tapped
}

-2

এই দৃশ্যে অঙ্গভঙ্গি যুক্ত করুন। সেই দৃশ্যে একটি চিত্র যুক্ত করুন এবং তারপরে এটি চিত্রটিতে কোনও অঙ্গভঙ্গিটি সনাক্ত করতে পারে। আপনি স্পর্শ ইভেন্টের প্রতিনিধি পদ্ধতিতে চেষ্টা করতে পারেন। তাহলে সেই ক্ষেত্রে এটি সনাক্তও করা হতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.