Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如果涉及superview,则不排除带有子视图的UIScrollView点击_Ios_Swift_Uikit - Fatal编程技术网

Ios 如果涉及superview,则不排除带有子视图的UIScrollView点击

Ios 如果涉及superview,则不排除带有子视图的UIScrollView点击,ios,swift,uikit,Ios,Swift,Uikit,因此,我试图创建一个界面,其中基本上有3个可能的视图级别 UIView负责决定新单元的元数据 细胞本身 背景UIScrollView 所有内容都是UIScrollView的子项,但1显示在2的顶部 目标是所有单元格都可以拖动,滚动视图可以滚动。但是,当点击滚动视图时,应触发新节点的创建,从而出现视图1,该视图将在按下提交按钮后消失 除了我有一个大问题外,我几乎什么都准备好了。如果我点击一个单元格,我仍然会得到创建视图,这意味着TapGestureRecognitor不排除子视图。下面是大致设置的

因此,我试图创建一个界面,其中基本上有3个可能的视图级别

  • UIView负责决定新单元的元数据
  • 细胞本身
  • 背景UIScrollView
  • 所有内容都是UIScrollView的子项,但1显示在2的顶部

    目标是所有单元格都可以拖动,滚动视图可以滚动。但是,当点击滚动视图时,应触发新节点的创建,从而出现视图1,该视图将在按下提交按钮后消失

    除了我有一个大问题外,我几乎什么都准备好了。如果我点击一个单元格,我仍然会得到创建视图,这意味着TapGestureRecognitor不排除子视图。下面是大致设置的内容:

    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
        }
    }
    

    当所有节点都是独占触摸时,为什么TaskView仍接收点击手势。

    代码不起作用,因为您没有为手势识别器分配代理。委托函数在节点和TaskView类中实现。但是您没有将类声明为委托,即

    class TaskView: UIScrollView, CreationDelecate, UIGestureRecognizerDelegate
    
    然后将代理指定给手势识别器:

    recognizer.delegate = self as! UIGestureRecognizerDelegate
    

    应能工作

    独占触摸意味着当您触摸此特定视图时,其他视图将不会接收后续的其他触摸。但是,如果您未触摸已将exclusive touch属性设置为true的视图,触摸其他视图仍将触发触摸事件。因此,您需要做的是,查找UIgestureRecognitizerDelegate方法,设置委托,并以这样的方式进行配置:如果节点接收到触摸,TaskView未收到该邮件。您能否共享一个邮政编码,以便我可以尝试?