ios swift uiimageview uitapgesturerecognizer

ios - Toque gesto en vista de imagen mĂșltiple dentro de vista de desplazamiento no activando evento, solo funciona el primer gesto de vista de imagen?



swift uiimageview (3)

En lugar de usar UIImageView puede usar UIButton y establecer la imagen de fondo en el botón y establecer el título "". Entonces no necesita agregar UIImageView y UIButton. UIButton puede obtener fácilmente el evento Tapped sobre UIScrollView.

El escenario es que tengo una vista de imagen que he agregado dentro de una vista de desplazamiento y luego agregué agregación de tapping en cada vista de imagen, pero solo el primer evento de disparo de una vista de imagen.

He intentado lo siguiente:

1. Extensión creada de imageview

extension UIImageView { public func openMenu() { let tapGestureRecognizer = UITapGestureRecognizer(target:self, action:Selector("handleTapGesture:")) //mImg.addGestureRecognizer() self.addGestureRecognizer(tapGestureRecognizer) print("open") } }

2. Se agregó un gesto de toque en el bucle (la forma en que se agregan las vistas de la imagen en la vista de desplazamiento de la misma forma en que se agregó lagestión)

//the loop go till all images will load for var index = 0; index < imagesName.count; index++ { let mImg: UIImageView = UIImageView() let pDict = homePageProductArr[index] as NSDictionary //Create a UIVIEW let containerView:UIView = UIView(frame: CGRect(x: 0, y: 0, width: 80, height: 100)) let nameLabel:UILabel = UILabel(frame:CGRect(x: xOffset+20, y: 85, width: 100, height: 20)) nameLabel.text = (pDict.objectForKey("CategoryName") as! String) nameLabel.font = UIFont(name: "Helvetica Neue", size: 10.0) containerView.addSubview(nameLabel) let tapMenuCategoryImageTGR = UITapGestureRecognizer(target: self, action: Selector("handleTapGesture:")) containerView.addGestureRecognizer(tapMenuCategoryImageTGR) // make the imageview object because in scrollview we need image mImg.frame = CGRectMake(5 + xOffset, 0, 80, 80) // the offset represent the values, used so that topleft for each image will // change with(5+xOffset, 0)and the bottomright(160, 110) //mImg.image = UIImage(named: imagesName[index]) mImg.imageFromUrl(imagesName[index]) //mImg.imageFromServerURL(imagesName[index]) //Creating Circular Image //mImg.layer.borderWidth = 1 mImg.layer.masksToBounds = true mImg.layer.borderColor = UIColor.whiteColor().CGColor mImg.layer.cornerRadius = mImg.frame.height/2 mImg.clipsToBounds = false mImg.openMenu() mImg.userInteractionEnabled = true mImg.addGestureRecognizer = tapMenuCategoryImageTGR // The image will put on the img object images.insert(mImg, atIndex: index) //Put the img object at the images array which is mutable array scrollview.contentSize = CGSizeMake(120 + xOffset, 110) //scroll view size show after 125 width the scroll view enabled scrollview.addSubview(images[index] as! UIView) //set images on scroll view xOffset += 100 }

Amablemente comparta sus sugerencias al respecto.


Esto no es un problema de UIScrollView. Podemos usar el gesto en una sola vista. Otra solución de su problema se da a continuación-

  1. Debes declarar el gesto de toque globalmente.

    var singleTap:UITapGestureRecognizer!

  2. En este paso creamos una función que toma una UIimageView y agrega el gesto en la parte superior.

    func setGesture(img_View:UIImageView) { singleTap = UITapGestureRecognizer.init(target: self, action: Selector("resignResponder")) singleTap.numberOfTapsRequired = 1 view.addGestureRecognizer(singleTap)

    }

  3. Ahora crea la acción del gesto.

    func resignResponder() { }

Estos son los tres pasos como la solución de su problema. Llame a "setGesture" para cada imageView. Puede reconocer con éxito el tap para cada imageView.


Finalmente se resolvió agregando el botón en la vista de la imagen, y haciendo que el color de fondo sea claro y el título en "":

Aquí está el fragmento de código:

//print(mDict.objectForKey("ImageURL")) //var scrollWidth: Int = 120 scrollview.contentSize = CGSizeMake(120.0, 80.0) var xOffset: CGFloat = 5 //the loop go till all images will load for index in 0 ..< imagesName.count { let mImg: UIImageView = UIImageView() //set placeholder image mImg.image = UIImage(named: "lazyload_icon.png") let pDict = homePageProductArr[index] as NSDictionary //Create a UIVIEW let containerView:UIView = UIView(frame: CGRect(x: 0, y: 0, width: 80, height: 120)) let nameLabel:UILabel = UILabel(frame:CGRect(x: xOffset+20, y: 95, width: 100, height: 20)) nameLabel.text = (pDict.objectForKey("CategoryName") as! String) nameLabel.font = UIFont(name: "Helvetica Neue", size: Constant().HomeLabelFontSize) nameLabel.textColor = UIColor.colorWithHexString(Constant().HomeLabelHexColorCode) //set line and wrap text nameLabel.numberOfLines = 0 nameLabel.sizeToFit() containerView.addSubview(nameLabel) containerView.userInteractionEnabled = false // make the imageview object because in scrollview we need image mImg.frame = CGRectMake(xOffset , 0, 90, 90) // the offset represent the values, used so that topleft for each image will // change with(5+xOffset, 0)and the bottomright(160, 110) //mImg.image = UIImage(named: imagesName[index]) mImg.imageFromUrl(imagesName[index]) //mImg.imageFromServerURL(imagesName[index]) //Creating Circular Image mImg.layer.masksToBounds = true mImg.layer.borderColor = UIColor.whiteColor().CGColor mImg.layer.cornerRadius = mImg.frame.height/2 mImg.clipsToBounds = false mImg.userInteractionEnabled = false // The image will put on the img object images.insert(mImg, atIndex: index) // Put the img object at the images array which is mutable array scrollview.contentSize = CGSizeMake(120 + xOffset, 110) //scroll view size show after 125 width the scroll view enabled containerView.addSubview(images[index] as! UIView) scrollview.addSubview(containerView)//images[index] as! UIView) // set images on scroll view xOffset += 100 //Adding button to fire event let touchButton:UIButton = UIButton() touchButton.frame = mImg.frame touchButton.backgroundColor = UIColor.clearColor() touchButton.tag = index touchButton.addTarget(self, action: Selector("touchCategoryAction:"), forControlEvents: UIControlEvents.TouchUpInside) touchButton.setTitle("", forState: UIControlState.Normal) scrollview.addSubview(touchButton) scrollview.bringSubviewToFront(touchButton)