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-
Debes declarar el gesto de toque globalmente.
var singleTap:UITapGestureRecognizer!
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)
}
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)