سؤال

انا املك UIImageView, ، والتي أريد أن أكون قادرًا على تغيير حجم وتدوير الخ.

يمكن UIGestureRecognizer يضاف إلى UIImageView?

أرغب في إضافة معرف التدوير والقرصة إلى أ UIImageView والتي سيتم إنشاؤها في وقت التشغيل.

كيف يمكن للمرء أن يضيف هذه التعرف؟

هل كانت مفيدة؟

المحلول

تحقق من ذلك 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...
}

نصائح أخرى

نعم ، يمكن إضافة uigesturereCognizer إلى UiimageView. كما هو مذكور في الإجابة الأخرى ، من المهم جدًا أن نتذكر تمكين تفاعل المستخدم في طريقة عرض الصورة من خلال ضبطه userInteractionEnabled خاصية ل YES. يرث UiimageView من UIVIEW ، الذي يتم تعيين خاصية تفاعل المستخدم على YES بشكل افتراضي ، تم تعيين خاصية تفاعل المستخدم الخاصة بـ UIIMageView NO بشكل افتراضي.

من مستندات UiimageView:

يتم تكوين كائنات عرض الصورة الجديدة لتجاهل أحداث المستخدم افتراضيًا. إذا كنت ترغب في التعامل مع الأحداث في فئة فرعية مخصصة لـ UIImageView ، فيجب عليك تغيير قيمة الخاصية userInterCayEnabled بشكل صريح إلى نعم بعد تهيئة الكائن.

على أي حال ، على الجزء الأكبر من الجواب. إليك مثال على كيفية إنشاء ملف 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
}

فيما يلي الطرق الثلاث التي سيتم استدعاؤها عند اكتشاف الإيماءات على وجهة نظرك. داخلهم ، سوف نتحقق من الوضع الحالي للإيماءة ، وإذا كان في البداية أو تغيير UIGestureRecognizerState سنقرأ خاصية مقياس/التدوير/الترجمة من الإيماءة ، ونطبق تلك البيانات على تحويل Affine ، وتطبيق تحويل Affine على طريقة عرض الصورة ، ثم إعادة تعيين مقياس الإيماءات/التناوب/الترجمة.

- (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];
    }
}

أخيرًا والأهم من ذلك ، ستحتاج إلى استخدام UigesturerEcognizerDelegate طريقة gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer للسماح للإيماءات بالعمل في نفس الوقت. إذا كانت هذه الإيماءات الثلاثة هي الإيماءات الثلاثة الوحيدة التي تم تعيين هذه الفئة كمفوضها ، فيمكنك ببساطة العودة YES كما هو مبين أدناه. ومع ذلك ، إذا كان لديك إيماءات إضافية تم تعيين هذه الفئة كفوضها ، فقد تحتاج إلى إضافة منطق إلى هذه الطريقة لتحديد الإيماءة التي هي قبل السماح لهم بالعمل معًا.

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

لا تنس التأكد من أن فصلك يتوافق مع UigesturerEcognizerDelegate بروتوكول. للقيام بذلك ، تأكد من أن واجهتك تبدو مثل هذا:

@interface MyClass : MySuperClass <UIGestureRecognizerDelegate>

إذا كنت تفضل اللعب مع الرمز في مشروع عينة العمل بنفسك ، فإن نموذج المشروع الذي قمت بإنشائه يحتوي على هذا الرمز يمكن العثور عليها هنا.

سريع 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")
}

الحلول 2.0 الحل

يمكنك إنشاء معرف التعرف على الإيماءات أو قرصة أو انتقاد في نفس القصر. أدناه ، سأمشي لك من خلال 4 خطوات للحصول على معرض التعرف على الجري.

4 خطوات

1.) ورث من UIGestureRecognizerDelegate عن طريق إضافته إلى توقيع الفصل الخاص بك.

class ViewController: UIViewController, UIGestureRecognizerDelegate {...}

2.) تحكم السحب من صورتك إلى ViewController الخاص بك لإنشاء iboutlet:

@IBOutlet weak var tapView: UIImageView!

3.) في ViewDidload ، أضف الكود التالي:

// 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)

4.) قم بإنشاء الوظيفة التي سيتم استدعاؤها عند استغلال معرف الإيماءات. (يمكنك استبعاد = 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)
    }
}

لقد فعلت هذا للتو مع Swift4 عن طريق إضافة 3 إيماءات معًا في عرض واحد

  1. uipinchgesturerecognizer : تكبير وتصغير الرؤية.
  2. uirotationgergereCognizer : تدوير المنظر.
  3. UipangesturereCognizer : سحب العرض.

هنا رمز نموذجي

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 مثال

override func viewDidLoad() {

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

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

لا توجد مندوبين لإيماءات أو تطبيقات أخرى عند الضرورة.

يمكنك أيضًا سحب إيماءات النقر إلى عرض الصورة في القصة المصورة. ثم قم بإنشاء إجراء بواسطة Ctrl+اسحب إلى الرمز ...

للكتل عاشق يمكنك استخدامه 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];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top