iOS - 在图像视图上点击手势问题

问题描述:

我正在慢慢地通过苹果的学习开发Swift,并且我一直用我的水龙头手势碰到问题。我已经重新创建了所有项目编号,并取得了相同的结果。iOS - 在图像视图上点击手势问题

我给图片视图添加了一个轻拍手势,这应该会从我的电脑打开照片库。什么都没发生。

当我从Apple下载并运行示例文件时,一切正常。当我将Apple的代码复制并粘贴到我的代码中时,没有任何反应。我已经经历了一切,但我觉得我失去了一些东西。

这是我的代码。苹果公司的代码如下:

import UIKit 

class ViewController: UIViewController, UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 

    // MARK: Properties 
    @IBOutlet weak var nameTextField: UITextField! 
    @IBOutlet weak var mealNameLabel: UILabel! 
    @IBOutlet weak var photoImageView: UIImageView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // handle the text fields user input through delegate callbacks 
     nameTextField.delegate = self 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    // MARK: UITextFieldDelegate 
    func textFieldShouldReturn(textField: UITextField) -> Bool { 
     // Hide the Keyboard 
     textField.resignFirstResponder() 
     return true 

    } 
    func textFieldDidEndEditing(textField: UITextField) { 
     mealNameLabel.text = textField.text 
    } 

    // MARK: UIImagePickerControllerDelegate 

    func imagePickerControllerDidCancel(picker: UIImagePickerController) { 
     // dismiss the picker if user cancels 
     dismissViewControllerAnimated(true, completion: nil) 
    } 

    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 
     // The info dictionary contains multiple representations of the image, and this uses the original. 
     let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage 

     // Set the photoviewimage to be the selected image 
     photoImageView.image = selectedImage 

     // Dismiss the picker 
     dismissViewControllerAnimated(true, completion: nil) 
    } 

    // MARK: Actions 

    @IBAction func selectImageFromPhotoLibrary(sender: UITapGestureRecognizer) { 
     // Hide the Keyboard 
     nameTextField.resignFirstResponder() 

     // UIImagePickerController is a view controller that lets a user pick media from their photo library. 
     let imagePickerController = UIImagePickerController() 

     // Only Allow pictures to be selected and not taken 
     imagePickerController.sourceType = .PhotoLibrary 

     // make sure the viewcontroller is notified when the user selects an image 
     imagePickerController.delegate = self 

     presentViewController(imagePickerController, animated: true, completion: nil) 

    } 

    @IBAction func setDefaultLabelText(sender: UIButton) { 
     mealNameLabel.text = "Default Text" 
    } 

} 

这里是苹果公司代码:

import UIKit 

class ViewController: UIViewController, UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 
    // MARK: Properties 

    @IBOutlet weak var nameTextField: UITextField! 
    @IBOutlet weak var mealNameLabel: UILabel! 
    @IBOutlet weak var photoImageView: UIImageView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Handle the text field’s user input through delegate callbacks. 
     nameTextField.delegate = self 
    } 

    // MARK: UITextFieldDelegate 

    func textFieldShouldReturn(textField: UITextField) -> Bool { 
     // Hide the keyboard. 
     textField.resignFirstResponder() 
     return true 
    } 

    func textFieldDidEndEditing(textField: UITextField) { 
     mealNameLabel.text = textField.text 
    } 

    // MARK: UIImagePickerControllerDelegate 
    func imagePickerControllerDidCancel(picker: UIImagePickerController) { 
     // Dismiss the picker if the user canceled. 
     dismissViewControllerAnimated(true, completion: nil) 
    } 

    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 
     // The info dictionary contains multiple representations of the image, and this uses the original. 
     let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage 

     // Set photoImageView to display the selected image. 
     photoImageView.image = selectedImage 

     // Dismiss the picker. 
     dismissViewControllerAnimated(true, completion: nil) 
    } 

    // MARK: Actions 
    @IBAction func selectImageFromPhotoLibrary(sender: UITapGestureRecognizer) { 
     // Hide the keyboard. 
     nameTextField.resignFirstResponder() 

     // UIImagePickerController is a view controller that lets a user pick media from their photo library. 
     let imagePickerController = UIImagePickerController() 

     // Only allow photos to be picked, not taken. 
     imagePickerController.sourceType = .PhotoLibrary 

     // Make sure ViewController is notified when the user picks an image. 
     imagePickerController.delegate = self 

     presentViewController(imagePickerController, animated: true, completion: nil) 
    } 

    @IBAction func setDefaultLabelText(sender: UIButton) { 
     mealNameLabel.text = "Default Text" 
    } 

} 

工作代码从庵埠

import UIKit 

class ViewController: UIViewController, UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 


    // MARK: Properties 
    @IBOutlet weak var nameTextField: UITextField! 
    @IBOutlet weak var mealNameLabel: UILabel! 
    @IBOutlet weak var photoImageView: UIImageView! 



    override func viewDidLoad() { 
     let tapgesture = UITapGestureRecognizer(target: self, action: Selector("imagepressed")) 
     photoImageView.userInteractionEnabled = true 
     photoImageView.addGestureRecognizer(tapgesture) 

     super.viewDidLoad() 

     // handle the text fields user input through delegate callbacks 
     nameTextField.delegate = self 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    // MARK: UITextFieldDelegate 
    func textFieldShouldReturn(textField: UITextField) -> Bool { 
     // Hide the Keyboard 
     textField.resignFirstResponder() 
     return true 

    } 
    func textFieldDidEndEditing(textField: UITextField) { 
     mealNameLabel.text = textField.text 
    } 

    // MARK: UIImagePickerControllerDelegate 

    func imagePickerControllerDidCancel(picker: UIImagePickerController) { 
     // dismiss the picker if user cancels 
     dismissViewControllerAnimated(true, completion: nil) 
    } 

    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 
     // The info dictionary contains multiple representations of the image, and this uses the original. 
     let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage 

     // Set the photoviewimage to be the selected image 
     photoImageView.image = selectedImage 

     // Dismiss the picker 
     dismissViewControllerAnimated(true, completion: nil) 
    } 

    // MARK: Actions 


    func imagepressed() { 
     nameTextField.resignFirstResponder() 

     // UIImagePickerController is a view controller that lets a user pick media from their photo library. 
     let imagePickerController = UIImagePickerController() 

     // Only Allow pictures to be selected and not taken 
     imagePickerController.sourceType = .PhotoLibrary 

     // make sure the viewcontroller is notified when the user selects an image 
     imagePickerController.delegate = self 

     presentViewController(imagePickerController, animated: true, completion: nil) 
    } 



/* @IBAction func selectImageFromPhotoLibrary(sender: UITapGestureRecognizer) { 
     let tapgesture = UITapGestureRecognizer(target: self, action: Selector("imagepressed")) 
     photoImageView.userInteractionEnabled = true 
     photoImageView.addGestureRecognizer(tapgesture) 

     // Hide the Keyboard 
     nameTextField.resignFirstResponder() 

     // UIImagePickerController is a view controller that lets a user pick media from their photo library. 
     let imagePickerController = UIImagePickerController() 

     // Only Allow pictures to be selected and not taken 
     imagePickerController.sourceType = .PhotoLibrary 

     // make sure the viewcontroller is notified when the user selects an image 
     imagePickerController.delegate = self 

     presentViewController(imagePickerController, animated: true, completion: nil) 

    } 
    */ 

    @IBAction func setDefaultLabelText(sender: UIButton) { 
     mealNameLabel.text = "Default Text" 
    } 

} 
+1

敲击手势识别器在哪里? – matt

+0

您是否在视图控制器的storyboard/XIB中添加了tapgesture识别器?如果您尚未将轻拍手势识别器添加到storyboard/xib,然后将操作方法​​连接到selectImageFromPhotoLibrary。 – iamyogish

+0

轻敲手势已添加到故事板到ImageView上,然后通过拖放方式连接到// Mark:使用UITapGesture的动作 –

不喜欢

的原因,默认情况下的UIImageView userInteraction是false,所以你需要手动启用

第1步

let tapGesture = UITapGestureRecognizer(target:self, action:Selector("imagePressed")) 
photoImageView.userInteractionEnabled = true // this line is important 
photoImageView.addGestureRecognizer(tapGesture) 

步骤2

func imagePressed() 
{ 
//do Your action here whatever you want 
} 
+0

我在哪里添加此项?这就是我一直在想的(至少在这些方面,因为我不想给自己多少功劳),但苹果开发人员并没有在任何地方展示这一点。 –

+0

on viewdidload call this –

+0

Andu,我已经尝试了几个不同的位置来使代码没有成功。随意像我两岁的儿子一样对待我,让我知道在哪里放置代码。另外,我只是复制并粘贴在基金selectuserimagefromlibrary下的代码粘贴到func imagepressed()? –

你在哪里添加UITapGestureRecognizer的图像视图?如果您将其添加到Storyboard中,是否将它连接到选择器selectImageFromPhotoLibrary:

+0

轻拍手势已添加到故事板到ImageView上,然后通过拖放方式连接到// Mark:使用UITapGesture的动作 –

我发现解决了这个问题的最简单方法是单击图像视图属性编辑器中的“用户交互已启用”复选框。 Screenshot

+0

本质上,此错误来自“添加照片照片”部分中缺少指令#12: “在”属性“检查器中,找到”交互“字段并选中”启用用户交互“复选框。 稍后您需要使用此功能才能让用户与图像视图交互。 – ToneDaBass

+0

在将“手势识别器”控制器连接到“图像视图”控制器之前,您必须检查真实的“用户交互已启用”。 –

您的代码非常好。问题出在UIImageView上。

默认情况下,当您将UIImageView添加到故事板时,“用户交互”选项未选中。

所以你只需要在故事板中启用这个选项。

  1. 转到您的故事板。

  2. 选择您的UIImageView(你把它命名为photoimageview)

  3. 现在,在“属性检查器”查找下的“互动”,“启用用户交互”,它应该是“检查”

  4. 现在运行你的项目它会工作。