当前位置: 首页 > 知识库问答 >
问题:

创建许多CAShapeLayers并在其中创建Unquue触摸事件

罗韬
2023-03-14

我想显示很多星星,当用户触摸其中一颗星星的内部时,我可以改变星星的颜色,并将星星id附加到数组中。

我有一个恒星坐标数组=[[恒星1的顶点坐标],[恒星2的顶点坐标],...,[恒星60的顶点坐标]]


//function to create a star UIBezierPath

func StarFromArray(points: [Array<Int>]  ) -> UIBezierPath {
        let starPath = UIBezierPath()
        let point1 = points[0]
        starPath.move(to: CGPoint(x: point1[0], y: point1[1]))
        
        for i in 1...(starPath.count-1) {
            let ar = starPath[i]
            starPath.addLine(to: CGPoint(x: ar[0], y: ar[1]))
        }
        starPath.close()
        
        return starPath
    }


//function to create and display every star from my StarArray, I call this in ViewDidLoad

func loadStar() {
        for i in 0...StarArray.size {
            let ar = StarArray[i]

            let starLayer = CAShapeLayer()
            let star = StarFromArray(points: ar)
            
            starLayer.path = star.cgPath
            starLayer.fillColor = UIColor.blue.cgColor
            self.view.layer.addSublayer(starLayer)
            
        }
    }


上面的代码显示了我所有的星星,现在我需要为我的每个星星创建一个触摸事件,这样当一个星星被触摸时,我可以将一个星星ID追加到一个数组中。

我该怎么做?

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        let touch = touches.first
        let point = touch!.location(in: self.view)

        if starLayer.path!.contains(point) {
            print("star touched")
            starLayer.fillColor = UIColor.blue.cgColor
            
        }
    }

上面的代码是如果我有一颗星的话可以使用的,但是如果我有很多颗星的话显然就不起作用了。

共有1个答案

曾洲
2023-03-14

不能将触摸事件发送到图层。你得自己处理。我建议在包含这些图层的视图上附加一个手势识别器,然后为每个图层添加一个包含边界矩形的结构数组,然后确定哪一个图层是这样点击的。

CALayer确实有一个最棒的方法,你可以用它来判断一个轻击是否落在一个图层中,但你必须自己来决定它。您可以在父层上调用hittest(),它会告诉您点击落在哪个子层(或父层)的帧上。

如果您想要检测不规则形状(如您的星型示例图像)内的抽头,您必须自己编写代码。(UIBezierPath和CGPath都有contains()方法,您可以使用这些方法查询路径,以查看某个点是否位于路径内部。)

 类似资料:
  • 请帮助我解决以下问题 我需要创建一个名为的触发器,每当“contact”表更新时就会触发该触发器。在更新联系人详细信息之后,这个触发器将把org_name和action插入到表中。受影响日志表中的操作名称为。 id整数org_name varchar2(255)street_address1 varchar2(255)street_address2 varchar2(255)城市varchar2(

  • 我试图在插入后创建一个触发器,它将更新另一个表。 这是我尝试的代码: 但我会收到以下错误消息: 1064-您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册,了解使用“@qte AS integer”附近的正确语法;声明@code为整数;从INSERTED中选择@QTE=qteInv;%s“位于第4行

  • 问题内容: 当我想使用SQL Server 2008 R2的预定义“创建触发器”创建触发器时,我迷路了。您能否给我一个直接的SQL语句,我可以用它创建触发器,并告诉我如何定义AFTER,BEFORE等所有内容? 另外,我如何知道行UPDATED / INSERTED / DELETED,并使用其列值在触发器内进行操作? 问题答案: 数据库是面向集合的,触发器也不例外。当执行给定的操作时,触发器将触

  • 我想获取GET参数的值并触发一个事件。如何在Created方法中触发事件? 我尝试了这种方式,但没有找到点击方法:

  • 我有一个烧瓶API,我使用烧瓶SQLAlChemy来处理SQLite数据库。我有一个存储日志条目的表,我想将最大行数限制为n。因为插入也是使用原始SQL从烧瓶之外的另一个脚本进行的,所以我创建了一个触发器来检查行数,如果行数高于n,则删除最旧的行数: 此触发器按预期工作,但我正在努力使用烧瓶-sqlalChemy设置它。如何设置触发器/执行原始SQL使用烧瓶sqlalChemy?SQL只需要在db

  • 触摸操作概述 浏览器的触摸 API 由三个部分组成。 Touch:一个触摸点 TouchList:多个触摸点的集合 TouchEvent:触摸引发的事件实例 Touch接口的实例对象用来表示触摸点(一根手指或者一根触摸笔),包括位置、大小、形状、压力、目标元素等属性。有时,触摸动作由多个触摸点(多根手指)组成,多个触摸点的集合由TouchList接口的实例对象表示。TouchEvent接口的实例对