在具有大量可点击图像视图的UIScrollView中,有什么好的方法可以提高性能?

问题描述 投票:0回答:1

有 100 多个图像视图,每个图像都需要可点击。事实上,每个都附加了一个点击手势识别器,这会损害性能。减少点击手势数量或提高性能的好策略是什么?

目前将其重写为集合视图风险太高。

ios uikit
1个回答
0
投票

多次点击手势会对您造成伤害,这感觉很奇怪,但您可以使用简单的单个手势识别器执行如下操作:

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
}
© www.soinside.com 2019 - 2024. All rights reserved.