UIImageView上的UIGestureRecognizer

jar*_*ryd 176 objective-c uiimageview uigesturerecognizer ios

我有一个UIImageView,我希望能够调整大小和旋转等.

可以UIGestureRecognizer添加到UIImageView

我想UIImageView在运行时创建一个旋转和捏合识别器.

如何添加这些识别器?

小智 422

检查userInteractionEnabled是否YESUIImageView.然后,您可以添加手势识别器.

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...
}
Run Code Online (Sandbox Code Playgroud)

  • +1在这里坐了好几年试图弄清楚为什么我的手势不起作用."检查UIImageView上的userInteractionEnabled是否为YES." 谢谢! (76认同)
  • imageView.userInteractionEnabled = YES; 这是关键!谢谢. (6认同)
  • 不,这只是展示了如何添加手势识别器.你必须在手势处理程序中进行实际的缩放/旋转.有关如何进行缩放的信息,请参阅示例应用[Touches_GestureRecognizers](http://developer.apple.com/library/ios/#samplecode/Touches/Introduction/Intro.html%23//apple_ref/doc/uid/DTS40007435) /旋转. (5认同)
  • 在Xcode 8 Objective-C/Swift中,`userInteractionEnabled`仍然必须设置为YES/true (3认同)

Mic*_*lum 75

是的,可以将UIGestureRecognizer添加到UIImageView.如其他答案中所述,记住通过将其userInteractionEnabled属性设置为在图像视图上启用用户交互非常重要YES.UIImageView继承自UIView,其用户交互属性YES默认设置为默认值,但UIImageView的用户交互属性NO默认设置为.

来自UIImageView文档:

默认情况下,新图像视图对象配置为忽略用户事件.如果要在UIImageView的自定义子类中处理事件,则必须在初始化对象后显式将userInteractionEnabled属性的值更改为YES.

无论如何,在答案的大部分.这是一个如何创建UIImageViewa UIPinchGestureRecognizer,a UIRotationGestureRecognizer和a 的示例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
}
Run Code Online (Sandbox Code Playgroud)

以下是检测到视图上的手势时将调用的三种方法.在它们内部,我们将检查手势的当前状态,如果它在开始或更改中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];
    }
}
Run Code Online (Sandbox Code Playgroud)

最后也非常重要的是,您需要使用UIGestureRecognizerDelegate方法gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer来允许手势同时工作.如果这三个手势是将此类指定为其委托的唯一三个手势,那么您可以简单地返回YES如下所示.但是,如果您有其他手势将此类指定为其委托,则可能需要向此方法添加逻辑,以确定在允许它们一起工作之前哪个手势.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

不要忘记确保您的类符合UIGestureRecognizerDelegate协议.为此,请确保您的界面看起来像这样:

@interface MyClass : MySuperClass <UIGestureRecognizerDelegate>
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢自己使用工作示例项目中的代码,可以在此处找到我创建的包含此代码的示例项目.


aya*_*aya 12

Swift 4.2

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

当点击时:

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


Dan*_*ieu 11

Swift 2.0解决方案

您可以在同一庄园中创建轻击,捏合或滑动手势识别器.下面我将向您介绍4个步骤,让您的识别器启动并运行.

4个步骤

1.)UIGestureRecognizerDelegate通过将其添加到您的类签名继承.

class ViewController: UIViewController, UIGestureRecognizerDelegate {...}
Run Code Online (Sandbox Code Playgroud)

2.)控制从图像拖动到viewController以创建IBOutlet:

@IBOutlet weak var tapView: UIImageView!
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

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)
}
Run Code Online (Sandbox Code Playgroud)

您的最终代码应如下所示:

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)
    }
}
Run Code Online (Sandbox Code Playgroud)


Lea*_*eat 5

我只是用swift4通过在单个视图中添加3个手势来完成此操作

  1. UIPinchGestureRecognizer:放大和缩小视图。
  2. UIRotationGestureRecognizer:旋转视图。
  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
     }

}
Run Code Online (Sandbox Code Playgroud)

如有任何问题,只需输入评论即可。谢谢