有 100 多个图像视图,每个图像都需要可点击。事实上,每个都附加了一个点击手势识别器,这会损害性能。减少点击手势数量或提高性能的好策略是什么?
目前将其重写为集合视图风险太高。
多次点击手势会对您造成伤害,这感觉很奇怪,但您可以使用简单的单个手势识别器执行如下操作:
class ContainerView: UIView {
@IBOutlet private var scrollView: UIScrollView?
@IBOutlet private var imageViews: [UIImageView]?
private func attachTapGestureRecogniser() {
addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(onImageTapped)))
}
@objc private func onImageTapped(_ sender: UIGestureRecognizer) {
guard let tappedImageIndex = imageViews?.firstIndex(where: { $0.bounds.contains(sender.location(in: $0)) }) else {
// No image was tapped
return
}
print("Image at index \(tappedImageIndex) was tapped")
}
}
如果图像重叠并且
firstIndex
不合适,那么您仍然可以获得命中区域内的所有图像视图并更好地处理它们。
另一方面,如果您有更多信息,您可以像这样计算索引:
@objc private func onImageTapped2(_ sender: UIGestureRecognizer) {
let rowHeight = 200 // Depends on your grid layout
let columnWidth = 200 // Depends on your grid layout
let itemsPerRow = 3
let positionInScrollView = sender.location(in: scrollView)
let row = Int(positionInScrollView.y/CGFloat(rowHeight))
let column = Int(positionInScrollView.x/CGFloat(columnWidth))
let tappedImageIndex = row*itemsPerRow + column
guard tappedImageIndex < imageViews?.count ?? 0 else {
// No image was tapped
return
}
print("Image at index \(tappedImageIndex) was tapped")
}
如果需要,您可以使用以下工具进入更深层次:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let pressLocation = touches.first?.location(in: self) else { return }
let locationInScrollView = self.convert(pressLocation, to: scrollView)
// Do stuff here with
}