Swift 使用手势识别器设置UIImageView的图像
我想问的是,是否可以使用手势识别器设置UIImageView的图像,或者是否有必要在UIImageView顶部覆盖一个按钮 我有一个UIImageView的outlet集合,称为ImageView。其中有四个,它们的标签设置为1到4。在我的viewDidLoad中,要将手势识别器添加到集合中的每个图像视图中,我使用了: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
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语句查看上面的我的解决方案,这似乎是一个更好的解决方案,即为什么我建议使用地图。做事总是有不同的方法。