ios - 如果涉及超级视图,则不排除带有子视图的 UIScrollView
问题描述
所以我正在尝试创建一个界面,其中基本上可以有 3 个级别的视图。
- UIView 负责决定新单元格的元数据
- 细胞本身
- 后台 UIScrollView
一切都是 UIScrollView 的孩子,但是 1 显示在 2 之上。
目标是所有单元格都是可拖动的,并且滚动视图是可滚动的。但是,当点击滚动视图时,应该会触发新节点的创建,因此视图 1 的外观将在按下提交按钮时消失。
我已经设置了几乎所有东西,除了我有一个大问题。如果我点击一个单元格,我仍然会得到创建视图,这意味着 TapGestureRecognizer 不排除子视图。所以大致是这样设置的:
class Node: UILabel {
var recognizer:UIPanGestureRecognizer?
init() {
self.isExclusiveTouch = true
self.isUserInteractionEnabled = true
recognizer = UIPanGestureRecognizer(target: self, action: #selector(drag))
self.addGestureRecognizer(recognizer!)
}
@objc
func drag(rec: UIPanGestureRecognizer) {
goToPoint(point: rec.location(in: self.superview!))
}
public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
var shouldReceive = false
if let clickedView = touch.view {
if clickedView == self {
shouldReceive = true;
}
}
return shouldReceive
}
}
class NodeCreator: UIView {
var submit: UIButton = UIButton(type: UIButton.ButtonType.roundedRect)
init() {
super.init(frame: CGRect.zero)
submit.setTitle("Submit", for: .normal)
submit.translatesAutoresizingMaskIntoConstraints = false
submit.addTarget(self, action: #selector(press), for: .touchUpInside)
self.addSubview(submit)
}
@objc func press() {
if let d = delegate {
if let t = inputField.text {
d.created(title: t, pt: storeP)
self.removeFromSuperview()
}
}
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
class TaskView: UIScrollView, CreationDelecate{
func created(title: String, pt: CGPoint) {
let temp = Node()
view.addNode(temp, at: pt)
}
var tapRecognizer:UITapGestureRecognizer?
var nodeSet:[Node] = []
func addNode(_ n1: Node, at: CGPoint = CGPoint.zero) {
nodeSet.append(n1)
n1.goToPoint(point: at)
self.addSubview(n1)
self.bringSubviewToFront(n1)
self.isScrollEnabled = true
self.isUserInteractionEnabled = true
self.isExclusiveTouch = false
self.canCancelContentTouches = false
if (tapRecognizer == nil) {
tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(tap))
self.addGestureRecognizer(tapRecognizer!)
}
}
@objc func tap(rec: UITapGestureRecognizer) {
let pos = rec.location(in: self)
let creator = NodeCreator(pt: pos)
creator.delegate = self
self.addSubview(creator)
}
public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
var shouldReceive = false
if let clickedView = touch.view {
if clickedView == self {
shouldReceive = true;
}
}
return shouldReceive
}
}
为什么当Nodes都是独占触摸时TaskView仍然收到点击手势。
解决方案
代码不起作用,因为您没有为手势识别器分配委托。委托功能在 Node 和 TaskView 类中实现。但是您没有将类声明为代表,即
class TaskView: UIScrollView, CreationDelecate, UIGestureRecognizerDelegate
比将委托分配给手势识别器:
recognizer.delegate = self as! UIGestureRecognizerDelegate
应该管用
推荐阅读
- html - 如何为所有子元素设置一个 CSS 类?(Angular 6,Ngx 引导程序)
- python - 使文件下载而不是显示的命令
- firebase - Ember Firebase 身份验证
- sql-server - 在 SSMS 2015 中为特定日期生成脚本并保存数据库中的数据
- php - 如何为一对多关系 Laravel 创建关联(在数据透视表中)?
- reactjs - 反应未定义状态
- javascript - 将带有延迟的异步 for 循环更改为同步 javascript
- python - 为复合假设策略抑制 HealthCheck.too_slow
- java - 如何与 mongoDB 建立 Android Studio 连接?
- php - 如何使用 Yii 框架中的链接将数据从后端连接到前端