如何在 Swift 中从 UIBeizierPath 识别 shapeLayer 中的对象?下面是示例应用程序 PopAGraph。提前致谢。
我的代码:
fileprivate func addNewPathToImage() {
path.lineJoinStyle = CGLineJoin.round
shapeLayer.path = path.cgPath
shapeLayer.strokeColor = strokeColor.cgColor
shapeLayer.fillColor = UIColor(red: 52/255, green: 152/255, blue: 219/255, alpha: 0.5).cgColor
shapeLayer.lineWidth = lineWidth
mainImageView.layer.addSublayer(shapeLayer)
}
我的图像和 shapeLayer:
最佳答案
CAShapeLayer 有一个 hitTest() 函数。在你的 super View 中:
private func setUpShapeLayer() {
self.isUserInteractionEnabled = true
let tapGesture = UITapGestureRecognizer()
tapGesture.numberOfTapsRequired = 1
tapGesture.addTarget(self, action: #selector(viewTapped))
self.addGestureRecognizer(tapGesture)
[your code to add shapeLayer]
}
internal func viewTapped(_ recognizer:UITapGestureRecognizer) {
let p = recognizer.location(in: self)
if (shapeLayer.hitTest(p) != nil) {
[do something here]
} else if (greenLayer.hitTest(p) != nil) {
}
编辑:如评论中所述,我完全误解了问题所在。
OP 中的链接指向一个应用程序,该应用程序看起来具有一些专有功能。如果您希望获得类似的 iOS“开箱即用”功能,这里是您可以做的最好的事情:
(1) 让用户通过平移轮廓创建一个 CAShapeLayer。
(2) 在图像上运行 CoreImage 过滤器 (CIEdges) 以检测所有边缘。
(3) 找到连续(没有端点的闭合)边缘的“最佳拟合”,其中所述边缘的 hitTest() 位于 CAShapeLayer 内并突出显示它。
我已经看过这个视频好几次了,这让我想知道 - 如果用户描绘了一个切断自由女神像头部的形状怎么办?该应用程序会做什么?砍掉雕像的头,认出完整的雕像,还是认不出?
这最后的观察并不意味着意见,而是指出这可能是一个展示应用程序“最佳案例”功能的演示。如果用户做了一些“不尽如人意”或出乎意料的事情,实际上可能会让您更好地了解它是如何完成它所做的事情的。
关于objective-c - 在 Swift 中识别层内的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40232759/