gpt4 book ai didi

ios - 如何指定同类型的 UIGestureRecognizer 的优先级?

转载 作者:行者123 更新时间:2023-11-28 13:53:29 24 4
gpt4 key购买 nike

我有一个基本的 UIView,其中嵌套了另一个 UIView。想象一个盒子,里面有一个更小的盒子。它甚至可以是一个 UIImageView 内部。只是某种观点。这两个 View 中的每一个都需要有一个 UITapGestureRecognizer。当我点击内部 View 之外的外部 View 中的任意位置时,我会执行一个操作。当我点击内部 View 时,我想执行不同的操作。

示例:我有一个外部容器 View 和一个内部 UIImageView。如果我点击内部 View 之外的外部 View ,那么我会转到下一个屏幕。如果我点击内部 ImageView ,它会在弹出窗口中将图像显示为放大版本。

我很难确定优先级。我知道内部 View 所在的 UITapGestureRecognizers 有重叠,但我想指定内部 View 识别器始终优先于外部 View 。

Apple 在 https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/coordinating_multiple_gesture_recognizers/preferring_one_gesture_over_another 的文档中指定了如何区分不同类型的手势识别器。但这并没有显示对同一个委托(delegate)使用相同的两个手势识别器。这是如何实现的?也许我没有正确理解文档。

我将手势识别器附加到代码中的 View ,当我将手势识别器添加到不同的 View 时,我尝试交换,在内部 View 识别器之前添加外部 View 识别器,然后相反。然而,它仍然每次只注册外 View 点击手势识别器。

下面是一些代码。我在界面生成器中创建了 View ,并将其导出到特定 View 中。 campaignContentView 是父 View ,pictureImageViewlinkDetailsView 是 subview 。有时我只是展示一张应该做一件事的图片。其他时候,我有一个带有相关缩略图的链接,点击其中一个应该会做另一件事。

@IBOutlet weak var campaignContentView: UIView!
@IBOutlet weak var pictureImageView: UIImageView!
@IBOutlet weak var linkDetailsView: UIView!

private func addNewGestureRecognizer(_ view: UIView) {
let tapView = UITapGestureRecognizer(target: self, action: #selector(CampaignActionContentView.tappedView(_:)))
campaignContentView.addGestureRecognizer(tapView)

switch view {
case linkDetailsView:
let tapLinkDetails = UITapGestureRecognizer(target: self, action: #selector(CampaignActionContentView.tappedLink(_:)))
let tapLinkPicture = UITapGestureRecognizer(target: self, action: #selector(CampaignActionContentView.tappedLink(_:)))
view.addGestureRecognizer(tapLinkDetails)
pictureImageView.addGestureRecognizer(tapLinkPicture)
case pictureImageView:
let tapPicture = UITapGestureRecognizer(target: self, action: #selector(CampaignActionContentView.tappedPicture(_:)))
view.addGestureRecognizer(tapPicture)
default:
print("No new gesture necessary")
}
}

我还相应地调用了 bringSubviewToFront(pictureImageView)bringSubviewToFront(linkDetailsView)。事实证明,linkDetailsView 的手势识别器实际上工作正常,只是 pictureImageView

最佳答案

这并没有回答如何指定优先级,但我可以解决你的问题。我认为您不需要使用手势优先级,除非一个 View 附加了两个手势。在您的情况下,您有两个具有自己手势的 View 。

我认为你真正的问题是你的内在观点不在你的外在观点之上。我建议查看 View 层次结构调试器。我在一个 View 中创建了一个 View ,并且能够确定他们自己的点击手势。

我在 Playground 上用点击手势创建了一个简单的两个盒子...

import UIKit
import PlaygroundSupport

class MyViewController : UIViewController {
override func loadView() {
let view = UIView()
view.backgroundColor = .white

let innerView = UIView()
innerView.backgroundColor = UIColor.red

view.addSubview(innerView)
innerView.translatesAutoresizingMaskIntoConstraints = false
innerView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
innerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
innerView.widthAnchor.constraint(equalToConstant: 100).isActive = true
innerView.heightAnchor.constraint(equalToConstant: 100).isActive = true

self.view = view

let outTapGesture = UITapGestureRecognizer(target: self, action: #selector(outterViewTapped))
let innerTapGesture = UITapGestureRecognizer(target: self, action: #selector(innerViewTapped))

view.addGestureRecognizer(outTapGesture)
innerView.addGestureRecognizer(innerTapGesture)
}

@objc func outterViewTapped() {
print("Outter tapped!")
}

@objc func innerViewTapped() {
print("Inner tapped!")
}
}
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()

关于ios - 如何指定同类型的 UIGestureRecognizer 的优先级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54228699/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com