ইউআইআইমেজভিউতে ইউআইজিস্টচারর সনাক্তকারী


179

আমার একটি রয়েছে UIImageView, যা আমি আকার পরিবর্তন করতে এবং ঘোরানো ইত্যাদি করতে চাই

একটি UIGestureRecognizerযোগ করা যাবে UIImageView?

আমি UIImageViewরানটাইমে তৈরি হওয়া একটিতে একটি ঘোরানো এবং চিমটি সনাক্তকারী যুক্ত করতে চাই ।

কীভাবে এই স্বীকৃতি যুক্ত করতে পারে?

উত্তর:


426

পরীক্ষা করে দেখুন যে userInteractionEnabledহয় YESউপর UIImageView। তারপরে আপনি একটি অঙ্গভঙ্গি সনাক্তকারী যুক্ত করতে পারেন।

imageView.userInteractionEnabled = YES;
UIPinchGestureRecognizer *pgr = [[UIPinchGestureRecognizer alloc] 
    initWithTarget:self action:@selector(handlePinch:)];
pgr.delegate = self;
[imageView addGestureRecognizer:pgr];
[pgr release];
:
:
- (void)handlePinch:(UIPinchGestureRecognizer *)pinchGestureRecognizer
{
  //handle pinch...
}

5
না, এটি কেবল অঙ্গভঙ্গি সনাক্তকারীকে কীভাবে যুক্ত করবেন তা দেখায়। অঙ্গভঙ্গি হ্যান্ডলারের মধ্যে আপনাকে আসল জুম / আবর্তন করতে হবে। কীভাবে জুম / ঘোরানো যায় সে সম্পর্কে নমুনা অ্যাপ্লিকেশন টাচ_জেষ্টাররনগনাইজারগুলি দেখুন ।

77
আমার অঙ্গভঙ্গিগুলি কেন কাজ করবে না তা বোঝার চেষ্টা করে যুগে যুগে এখানে +1 বসেছিল .. "ইউআইআইমেজভিউতে ব্যবহারকারী ব্যবহারকারীর সক্রিয়করণটি হ্যাঁ হ্যাঁ এটি পরীক্ষা করুন" " ধন্যবাদ!
সমালোচক

1
সামগ্রিক দর্শনে কোনও সনাক্তকারীকে সীমাবদ্ধ করার চেষ্টা করার চেয়ে এটি অবশ্যই আমার কাজটিকে সহজ করে দিয়েছে। ধন্যবাদ!
জোশ কোবাচ

6
imageView.userInterationEn सक्षम = ইয়েস; এই কী! ধন্যবাদ.
হামাসএন

3
userInteractionEnabledএখনও অবশ্যই YES /
Xxode

76

হ্যাঁ, একটি ইউআইজিস্টচারআর সনাক্তকারীকে একটি ইউআইআইমেজভিউতে যুক্ত করা যেতে পারে। অন্য উত্তরে বর্ণিত হিসাবে, ইমেজ ভিউটিতে তার userInteractionEnabledসম্পত্তি সেট করে ব্যবহারকারী ইন্টারঅ্যাকশন সক্ষম করার বিষয়টি মনে রাখা খুব গুরুত্বপূর্ণ YES। ইউআইআইভিজভিউ ইউআইভিউর উত্তরাধিকার সূত্রে প্রাপ্ত, যার ব্যবহারকারীর ইন্টারঅ্যাকশন সম্পত্তিটি YESডিফল্টরূপে সেট করা আছে , তবে ইউআইআইমেজভিউর ব্যবহারকারীর ইন্টারঅ্যাকশন সম্পত্তিটি NOডিফল্টরূপে সেট করা আছে ।

থেকে UIImageView দস্তাবেজ:

নতুন চিত্র প্রদর্শনের অবজেক্টগুলি ডিফল্টরূপে ব্যবহারকারীর ইভেন্টগুলি উপেক্ষা করার জন্য কনফিগার করা হয়। আপনি যদি ইউআইআইভিজভিউয়ের একটি কাস্টম সাবক্লাসে ইভেন্টগুলি পরিচালনা করতে চান তবে আপনাকে অবশ্যই অবজেক্টের সূচনা করার পরে ব্যবহারকারীর পরিচয়-সক্রিয় বৈশিষ্ট্যটির মানটি হ্যাঁ হ্যাঁ পরিবর্তন করতে হবে।

যাইহোক, উত্তরের পরিমাণে। কীভাবে UIImageViewএকটি UIPinchGestureRecognizer, ক UIRotationGestureRecognizerএবং ক দিয়ে তৈরি করবেন তার উদাহরণ এখানে UIPanGestureRecognizer

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

- (void)viewDidLoad
{
    [super viewDidLoad];

    // set up the image view
    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"someImage"]];
    [imageView setBounds:CGRectMake(0.0, 0.0, 120.0, 120.0)];
    [imageView setCenter:self.view.center];
    [imageView setUserInteractionEnabled:YES]; // <--- This is very important

    // create and configure the pinch gesture
    UIPinchGestureRecognizer *pinchGestureRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchGestureDetected:)];
    [pinchGestureRecognizer setDelegate:self];
    [imageView addGestureRecognizer:pinchGestureRecognizer];

    // create and configure the rotation gesture
    UIRotationGestureRecognizer *rotationGestureRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationGestureDetected:)];
    [rotationGestureRecognizer setDelegate:self];
    [imageView addGestureRecognizer:rotationGestureRecognizer];

    // creat and configure the pan gesture
    UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGestureDetected:)];
    [panGestureRecognizer setDelegate:self];
    [imageView addGestureRecognizer:panGestureRecognizer];


    [self.view addSubview:imageView]; // add the image view as a subview of the view controllers view
}

আপনার ভিউয়ের অঙ্গভঙ্গিগুলি সনাক্ত করা হলে এখানে তিনটি পদ্ধতি বলা হবে called তাদের অভ্যন্তরে, আমরা অঙ্গভঙ্গির বর্তমান অবস্থা যাচাই করব এবং এটি যদি শুরু হয় বা পরিবর্তিত হয় তবে UIGestureRecognizerStateআমরা অঙ্গভঙ্গির স্কেল / আবর্তন / অনুবাদ সম্পত্তি পড়ব, সেই তথ্যটি একটি অ্যাফাইন ট্রান্সফর্মারে প্রয়োগ করব, চিত্রটিতে অ্যাফাইন রূপান্তরটি প্রয়োগ করব দেখুন এবং তার পরে অঙ্গভঙ্গির স্কেল / রোটেশন / অনুবাদটি পুনরায় সেট করুন।

- (void)pinchGestureDetected:(UIPinchGestureRecognizer *)recognizer
{
    UIGestureRecognizerState state = [recognizer state];

    if (state == UIGestureRecognizerStateBegan || state == UIGestureRecognizerStateChanged)
    {
        CGFloat scale = [recognizer scale];
        [recognizer.view setTransform:CGAffineTransformScale(recognizer.view.transform, scale, scale)];
        [recognizer setScale:1.0];
    }
}

- (void)rotationGestureDetected:(UIRotationGestureRecognizer *)recognizer
{
    UIGestureRecognizerState state = [recognizer state];

    if (state == UIGestureRecognizerStateBegan || state == UIGestureRecognizerStateChanged)
    {
        CGFloat rotation = [recognizer rotation];
        [recognizer.view setTransform:CGAffineTransformRotate(recognizer.view.transform, rotation)];
        [recognizer setRotation:0];
    }
}

- (void)panGestureDetected:(UIPanGestureRecognizer *)recognizer
{
    UIGestureRecognizerState state = [recognizer state];

    if (state == UIGestureRecognizerStateBegan || state == UIGestureRecognizerStateChanged)
    {
        CGPoint translation = [recognizer translationInView:recognizer.view];
        [recognizer.view setTransform:CGAffineTransformTranslate(recognizer.view.transform, translation.x, translation.y)];
        [recognizer setTranslation:CGPointZero inView:recognizer.view];
    }
}

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

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

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

@interface MyClass : MySuperClass <UIGestureRecognizerDelegate>

আপনি যদি কোনও ওয়ার্কিং নমুনা প্রকল্পে কোডটির সাথে নিজেকে খেলতে পছন্দ করেন তবে আমি এই কোডটি সহ যে নমুনা প্রকল্পটি তৈরি করেছি তা এখানে পাওয়া যাবে।


1
এটি স্ট্যাকওভারফ্লো ডট কম এ আমি এখনও দেখেছি সেরা উত্তর, সম্পূর্ণ বিস্তারিত, ভাল মন্তব্য করা এবং এমনকি গিটের উত্স কোডও অন্তর্ভুক্ত। তার জন্য ধন্যবাদ
আলেজান্দ্রো লুয়েঙ্গো

1
পরিষ্কার, ধাপে ধাপে, দুর্দান্ত ব্যাখ্যা
অ্যালভিন

1
আপনাকে ধন্যবাদ, এটি একটি পৃষ্ঠায় বা দু'একটি কাজ করেছিল যা অ্যাপল এবং অন্যান্যরা কয়েক বছর ধরে কয়েক ডজন টিউটোরিয়াল করতে ব্যর্থ হয়েছিল। আমি অনুভব করি যে আইওএস-এ আরও অনেকগুলি জিনিস অবশ্যই রয়েছে যা সম্ভব, তবে অবজ্ঞা এবং ভুল বোঝাবুঝির কারণে সেগুলি আমাদের কাছে হারিয়ে যায়।
জ্যাক মরিস

দুর্দান্ত উত্তর, সেরা। আপনার ধৈর্য জন্য অনেক ধন্যবাদ।
জর্জি বি জর্জি

13

সুইফট 4.2

myImageView.isUserInteractionEnabled = true
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped))
tapGestureRecognizer.numberOfTapsRequired = 1
myImageView.addGestureRecognizer(tapGestureRecognizer)

এবং যখন আলতো চাপুন:

@objc func imageTapped(_ sender: UITapGestureRecognizer) {
   // do something when image tapped
   print("image tapped")
}

11

সুইফট 2.0 সমাধান

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

4 পদক্ষেপ

১)UIGestureRecognizerDelegate এটিকে আপনার শ্রেণীর স্বাক্ষরে যুক্ত করে উত্তরাধিকারী করুন ।

class ViewController: UIViewController, UIGestureRecognizerDelegate {...}

২) আইবিআউটলেট তৈরি করতে আপনার চিত্র থেকে আপনার ভিউকন্ট্রোলারের কাছে টানুন নিয়ন্ত্রণ করুন:

@IBOutlet weak var tapView: UIImageView!

).) আপনার ভিউডিডলডে নিম্নলিখিত কোড যুক্ত করুন:

// create an instance of UITapGestureRecognizer and tell it to run 
// an action we'll call "handleTap:"
let tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
// we use our delegate
tap.delegate = self
// allow for user interaction
tapView.userInteractionEnabled = true
// add tap as a gestureRecognizer to tapView
tapView.addGestureRecognizer(tap)

৪) আপনার অঙ্গভঙ্গি সনাক্তকারীকে টেপ করা হলে সেই ফাংশনটি তৈরি করুন। (আপনি = nilযদি এটি পছন্দ করেন তবে বাদ দিতে পারেন)।

func handleTap(sender: UITapGestureRecognizer? = nil) {
    // just creating an alert to prove our tap worked!
    let tapAlert = UIAlertController(title: "hmmm...", message: "this actually worked?", preferredStyle: UIAlertControllerStyle.Alert)
    tapAlert.addAction(UIAlertAction(title: "OK", style: .Destructive, handler: nil))
    self.presentViewController(tapAlert, animated: true, completion: nil)
}

আপনার চূড়ান্ত কোডটি এর মতো দেখতে হবে:

class ViewController: UIViewController, UIGestureRecognizerDelegate {

    @IBOutlet weak var tapView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let tap = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
        tap.delegate = self
        tapView.userInteractionEnabled = true
        tapView.addGestureRecognizer(tap)
    }

    func handleTap(sender: UITapGestureRecognizer? = nil) {
        let tapAlert = UIAlertController(title: "hmmm...", message: "this actually worked?", preferredStyle: UIAlertControllerStyle.Alert)
        tapAlert.addAction(UIAlertAction(title: "OK", style: .Destructive, handler: nil))
        self.presentViewController(tapAlert, animated: true, completion: nil)
    }
}

1
আমি এই সম্পর্কে এখানে একটি ব্লগ লিখেছি: কোডবিউলিউইউইউ
ড্যান

6

আমি কেবল একক দৃশ্যে 3 টি অঙ্গভঙ্গি যোগ করে swift4 দিয়ে এটি করেছি

  1. ইউআইপিঞ্চচেষ্টারর সনাক্তকারী : জুম ইন এবং দেখুন জুম আউট।
  2. ইউআইআরোটেশনগ্যাসচারর সনাক্তকারী : দর্শনটি ঘোরান।
  3. ইউআইপ্যানগ্যাসচারর সনাক্তকারী : দর্শনটিকে টেনে নিয়ে যাওয়া।

এখানে আমার নমুনা কোড

class ViewController: UIViewController: UIGestureRecognizerDelegate{
      //your image view that outlet from storyboard or xibs file.
     @IBOutlet weak var imgView: UIImageView!
     // declare gesture recognizer
     var panRecognizer: UIPanGestureRecognizer?
     var pinchRecognizer: UIPinchGestureRecognizer?
     var rotateRecognizer: UIRotationGestureRecognizer?

     override func viewDidLoad() {
          super.viewDidLoad()
          // Create gesture with target self(viewcontroller) and handler function.  
          self.panRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.handlePan(recognizer:)))
          self.pinchRecognizer = UIPinchGestureRecognizer(target: self, action: #selector(self.handlePinch(recognizer:)))
          self.rotateRecognizer = UIRotationGestureRecognizer(target: self, action: #selector(self.handleRotate(recognizer:)))
          //delegate gesture with UIGestureRecognizerDelegate
          pinchRecognizer?.delegate = self
          rotateRecognizer?.delegate = self
          panRecognizer?.delegate = self
          // than add gesture to imgView
          self.imgView.addGestureRecognizer(panRecognizer!)
          self.imgView.addGestureRecognizer(pinchRecognizer!)
          self.imgView.addGestureRecognizer(rotateRecognizer!)
     }

     // handle UIPanGestureRecognizer 
     @objc func handlePan(recognizer: UIPanGestureRecognizer) {    
          let gview = recognizer.view
          if recognizer.state == .began || recognizer.state == .changed {
               let translation = recognizer.translation(in: gview?.superview)
               gview?.center = CGPoint(x: (gview?.center.x)! + translation.x, y: (gview?.center.y)! + translation.y)
               recognizer.setTranslation(CGPoint.zero, in: gview?.superview)
          }
     }

     // handle UIPinchGestureRecognizer 
     @objc func handlePinch(recognizer: UIPinchGestureRecognizer) {
          if recognizer.state == .began || recognizer.state == .changed {
               recognizer.view?.transform = (recognizer.view?.transform.scaledBy(x: recognizer.scale, y: recognizer.scale))!
               recognizer.scale = 1.0
         }
     }   

     // handle UIRotationGestureRecognizer 
     @objc func handleRotate(recognizer: UIRotationGestureRecognizer) {
          if recognizer.state == .began || recognizer.state == .changed {
               recognizer.view?.transform = (recognizer.view?.transform.rotated(by: recognizer.rotation))!
               recognizer.rotation = 0.0
           }
     }

     // mark sure you override this function to make gestures work together 
     func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
         return true
     }

}

যে কোনও প্রশ্ন, মন্তব্য করতে টাইপ করুন। ধন্যবাদ


3

সুইফট 3 উদাহরণ

override func viewDidLoad() {

    self.backgroundImageView.addGestureRecognizer(
        UITapGestureRecognizer.init(target: self, action:#selector(didTapImageview(_:)))
    )

    self.backgroundImageView.isUserInteractionEnabled = true
}

func didTapImageview(_ sender: Any) {
    // do something
}

কোনও অঙ্গভঙ্গি রিকনগাইনাজার প্রতিনিধি বা অন্যান্য বাস্তবায়ন যেখানে প্রয়োজন হবে না।


2

আপনি ইমেজ দর্শনে একটি টোকা অঙ্গভঙ্গি সনাক্তকারীকে টেনে আনতে পারেন Storyboard। তারপরে ctrl + dragকোড অনুসারে একটি ক্রিয়া তৈরি করুন ।


1

ব্লক প্রেমীদের জন্য আপনি ব্লকে অঙ্গভঙ্গির ক্রিয়া যুক্ত করতে ALActionBlocks ব্যবহার করতে পারেন

__weak ALViewController *wSelf = self;
imageView.userInteractionEnabled = YES;
UITapGestureRecognizer *gr = [[UITapGestureRecognizer alloc] initWithBlock:^(UITapGestureRecognizer *weakGR) {
    NSLog(@"pan %@", NSStringFromCGPoint([weakGR locationInView:wSelf.view]));
}];
[self.imageView addGestureRecognizer:gr];
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.