【发布时间】:2021-06-19 03:23:01
【问题描述】:
Swift 5/Xcode 12.4
我为我的自定义 MarkerView 创建了一个 xib 文件 - 布局非常简单:
- View
-- StackView
--- DotLabel
--- NameLabel
View 和 StackView 默认在检查器中都设置为“启用用户交互”。 DotLabel 和 NameLabel 没有,但勾选他们的框似乎并没有真正改变任何东西。
在运行时,我在 ViewController 中创建 MarkerViews(仅用于测试目的),并将它们添加到已经包含图像的 ScrollView(这可行):
override func viewDidAppear(_ animated: Bool) {
createMarkers()
setUpMarkers()
}
private func createMarkers() {
let marker = MarkerView()
marker.setUp("Some Text")
markers.append(marker)
scrollView.addSubview(marker)
marker.alpha = 0.0
}
private func setUpMarkers() {
for (i,m) in markers.enumerated() {
m.frame.origin = CGPoint(x: (i+1)*100,y: (i+1)*100)
m.alpha = 1.0
}
}
这些 MarkerViews 应该是可点击的,所以我添加了一个 UITapGestureRecognizer 但从未调用过链接的函数。这是我的完整 MarkerView:
class MarkerView: UIView {
@IBOutlet weak var stackView: UIStackView!
@IBOutlet weak var dotLabel: UILabel!
@IBOutlet weak var nameLabel: UILabel!
let nibName = "MarkerView"
var contentView:UIView?
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
commonInit()
}
func commonInit() {
guard let view = loadViewFromNib() else { return }
view.frame = self.bounds
self.addSubview(view)
contentView = view
let gesture = UITapGestureRecognizer(target: self, action: #selector(self.clickedMarker))
self.addGestureRecognizer(gesture)
}
func loadViewFromNib() -> UIView? {
let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: nibName, bundle: bundle)
return nib.instantiate(withOwner: self, options: nil).first as? UIView
}
func setUp(_ name:String) {
nameLabel.text = name
nameLabel.sizeToFit()
stackView.sizeToFit()
}
@objc private func clickedMarker() {
print("Clicked Marker!")
}
}
其他问题建议在添加手势识别器之前添加self.isUserInteractionEnabled = true。我什至为 StackView 和两个标签都启用了它,还尝试将手势识别器添加到 ScrollView,但都没有帮助。
为什么手势识别器不工作,我该如何解决这个问题?
编辑:根据 Sweeper 的建议,我的代码现在如下所示:
class MarkerView: UIView, UIGestureRecognizerDelegate {
.....
func commonInit() {
guard let view = loadViewFromNib() else { return }
view.frame = self.bounds
let gesture = UITapGestureRecognizer(target: self, action: #selector(self.clickedMarker))
gesture.delegate = self
self.isUserInteractionEnabled = true
self.addGestureRecognizer(gesture)
self.addSubview(view)
contentView = view
}
.....
func gestureRecognizer(_: UIGestureRecognizer, _ otherGestureRecognizer: UIGestureRecognizer) -> Bool {
print("gestureRecognizer")
return true
}
}
“gestureRecognizer”永远不会打印到控制台。
【问题讨论】:
-
滚动视图的手势识别器可能会干扰您的手势识别器。
-
@Sweeper 我没有向 ScrollView 添加额外的手势识别器,如果它有一个(不知道 ScrollView 是如何工作的),我没有触摸它。我“搞砸”的唯一识别器是 MarkerView 一个,但那个不起作用。
-
滚动视图有手势识别器。否则你不能滚动它,对吗?您无需触摸它即可干扰您的手势识别器。看到这个possible duplicate。
-
您没有使用 MarkerView 初始化程序覆盖,如
let marker = MarkerView.init(frame: CGRect.zero) -
@CSmith 我刚刚在
init(frame: CGRect)中打印了一个打印件,它与我的版本一起打印到控制台。我也测试了你的,没有发现有什么不同。是否有理由改为使用较长的版本?
标签: ios swift uiview uigesturerecognizer uitapgesturerecognizer