Swift 使用手势识别器设置UIImageView的图像

Swift 使用手势识别器设置UIImageView的图像,swift,xcode,uiimageview,uiimagepickercontroller,uigesturerecognizer,Swift,Xcode,Uiimageview,Uiimagepickercontroller,Uigesturerecognizer,我想问的是,是否可以使用手势识别器设置UIImageView的图像,或者是否有必要在UIImageView顶部覆盖一个按钮 我有一个UIImageView的outlet集合,称为ImageView。其中有四个,它们的标签设置为1到4。在我的viewDidLoad中,要将手势识别器添加到集合中的每个图像视图中,我使用了: override func viewDidLoad() { super.viewDidLoad() for i in (0..<imageViews.co

我想问的是,是否可以使用手势识别器设置UIImageView的图像,或者是否有必要在UIImageView顶部覆盖一个按钮

我有一个UIImageView的outlet集合,称为ImageView。其中有四个,它们的标签设置为1到4。在我的viewDidLoad中,要将手势识别器添加到集合中的每个图像视图中,我使用了:

override func viewDidLoad() {
    super.viewDidLoad()

    for i in (0..<imageViews.count) {

        let imageViewTapped = UITapGestureRecognizer(target: self, action: #selector(selectImage(tap:)))
        imageViewTapped.numberOfTapsRequired = 1
        imageViews[i].addGestureRecognizer(imageViewTapped)

    }

}
selectedImageView是viewController类中具有UIImageView类型的变量。我的想法是,这个变量可以保存被点击的UIImageView,它由GestureRecognitor识别,如上所示。然后可以稍后将其传递给代理

接下来,我创建了委托,didFinishPickingMediaWithInfo和didCancel,不过为了简洁起见,我将只显示前者。两者都是在viewController类中创建的:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

    var chosenImage = UIImage()
    chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage
    self.selectedImageView.image = chosenImage

    dismiss(animated: true, completion: nil)

}
不幸的是,点击的图像视图的图像没有更新为从库中选择的图像。正确的方法是什么?我觉得我的viewController被这些代码弄得臃肿不堪,可以把它移到一个单独的类中吗?我这样做是不是错了,应该只覆盖一个按钮

编辑

到目前为止,我能想到的最好的方法是在imagePickerController中使用一个switch语句,其中imageViewOne、imageViewTwo等是每个UIImageView的出口:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

    var chosenImage = UIImage()
    chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage

    switch self.viewTappedTag {
    case 1:
        imageViewOne.image = chosenImage
    case 2:
        imageViewTwo.image = chosenImage
    case 3:
        imageViewThree.image = chosenImage
    case 4:
        imageViewFour.image = chosenImage
    default:
        imageViewOne.image = chosenImage

    }

    dismiss(animated: true, completion: nil)

}

其中viewTappedTag是一个viewController类变量,其值由点击的视图的标记定义,并在GestureRecognitor中设置。有人能改进这一点吗?

更新代码如下

在类中声明一个变量,如下所示

var selectedImageViewIndex = 0 //by default selected image view is 0th image view


func selectImage(tap: UITapGestureRecognizer) {

    var imagePicker = UIImagePickerController()
    imagePicker.delegate = self
    imagePicker.sourceType = .photoLibrary
    imagePicker.allowsEditing = false
    imagePicker.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)!
    self.present(imagePicker, animated: true, completion: nil)

    guard let viewTappedTag = tap.view?.tag else {return}

    self.selectedImageView = imageViews[viewTappedTag - 1] 

    //Add the following line
    self.selectedImageViewIndex = viewTappedTag - 1

}



func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

    var chosenImage = UIImage()
    chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage
    self.selectedImageView.image = chosenImage

    //Add the following line
    self.imageView[self.selectedImageViewIndex].image = chosenImage
    dismiss(animated: true, completion: nil)

}

尽管我建议不要使用viewTappedTag-1,而是从映射对象获取索引和点击图像标记的值。

更新代码如下

在类中声明一个变量,如下所示

var selectedImageViewIndex = 0 //by default selected image view is 0th image view


func selectImage(tap: UITapGestureRecognizer) {

    var imagePicker = UIImagePickerController()
    imagePicker.delegate = self
    imagePicker.sourceType = .photoLibrary
    imagePicker.allowsEditing = false
    imagePicker.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)!
    self.present(imagePicker, animated: true, completion: nil)

    guard let viewTappedTag = tap.view?.tag else {return}

    self.selectedImageView = imageViews[viewTappedTag - 1] 

    //Add the following line
    self.selectedImageViewIndex = viewTappedTag - 1

}



func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

    var chosenImage = UIImage()
    chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage
    self.selectedImageView.image = chosenImage

    //Add the following line
    self.imageView[self.selectedImageViewIndex].image = chosenImage
    dismiss(animated: true, completion: nil)

}

尽管我建议不要使用viewTappedTag-1,而是从映射对象获取索引和点击图像标记的值。

最后,我使用了一个switch语句来实现我的目标:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

var chosenImage = UIImage()
chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage

switch self.viewTappedTag {
case 1:
    imageViewOne.image = chosenImage
case 2:
    imageViewTwo.image = chosenImage
case 3:
    imageViewThree.image = chosenImage
case 4:
    imageViewFour.image = chosenImage
default:
    imageViewOne.image = chosenImage

}

dismiss(animated: true, completion: nil)

}

最后,我使用switch语句实现了我的目标:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

var chosenImage = UIImage()
chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage

switch self.viewTappedTag {
case 1:
    imageViewOne.image = chosenImage
case 2:
    imageViewTwo.image = chosenImage
case 3:
    imageViewThree.image = chosenImage
case 4:
    imageViewFour.image = chosenImage
default:
    imageViewOne.image = chosenImage

}

dismiss(animated: true, completion: nil)

}

如果我没有错的话,你的目标是创建一个有5个图像视图的界面,其中4个有手势识别器,在你点击其中一个之后。当从图像选择器控制器添加一个新图像到selectedImageView时,它应该是会被更改的图像?Hi@MukulMore,几乎,我有4个图像视图,而不是5个,但你其余的陈述是正确的。我已将图像视图的标记从1设置为4,因为对象的默认标记值为0。如果我没有弄错,您的目标是创建一个界面,其中有5个图像视图,其中4个具有手势识别器,并且在您点击其中一个后。当从图像拾取器控制器将新图像添加到中时,该图像应该会更改selectedImageView?嗨@MukulMore,差不多了,我有4个图像视图,不是5个,但是你的陈述的其余部分是正确的。我已将图像视图的标记从1设置为4,因为对象的默认标记值为0。Hi@Mukul More,这不起作用,因为变量“selectedImageViewIndex”的类型是整数,而集合出口“ImageView”是UIImageView的数组。因此,行“self.selectedImageViewIndex=imageViews”中存在类型冲突[查看TappedTag-1]'因为这将返回UIImageView,而不是整数。请将其更改为.self.selectedImageViewIndex=viewTappedTag-1。通过图像视图在outlet集合数组中的位置访问图像视图不是一个好方法,因为它们的位置是任意的:请使用switch语句查看上面的我的解决方案,这似乎是一个更好的解决方案,即为什么我建议使用映射。做事总是有不同的方法。您好@Mukul More,这不起作用,因为变量“selectedImageViewIndex”的类型是整数,而集合出口“ImageView”是UIImageView的数组。因此,行“self.selectedImageViewIndex=imageViews[viewTappedTag-1]中存在类型冲突'因为这将返回UIImageView,而不是整数。请将其更改为.self.selectedImageViewIndex=viewTappedTag-1。通过图像视图在outlet集合数组中的位置访问图像视图不是一个好方法,因为它们的位置是任意的:请使用switch语句查看上面的我的解决方案,这似乎是一个更好的解决方案,即为什么我建议使用地图。做事总是有不同的方法。