【问题标题】:CAShapeLayer. After rotating frame coordinates update but path coordinates don'tCAShapeLayer。旋转框架坐标更新但路径坐标不更新后
【发布时间】:2018-07-20 22:57:12
【问题描述】:

这对我来说很奇怪,在花了两天时间尝试修复它并阅读了我在苹果网站上可以找到的内容和堆栈溢出之后,我仍然没有解决方案。希望有人可以帮助我。

所以我正在旋转视图坐标系中的 CAShapeLayer。旋转后,框架坐标会更新,但路径的坐标不会更新。

在屏幕上,路径和框架都显示为旋转!所以如果我使用 path.contains 来查看一个点在旋转后是否属于 CAShapeLayer,我会得到错误的答案。使用旋转的框架不起作用,因为相邻路径的框架可能重叠并给出错误的答案。

这里是旋转相关 CAShapeLayer 的代码:

            let shapeCopy = CAShapeLayer()
            let inputShape = tempShapeList[index]
            shapeCopy.backgroundColor =UIColor.red.withAlphaComponent(0.75).cgColor
            shapeCopy.frame = inputShape.frame
            shapeCopy.bounds = inputShape.bounds
            shapeCopy.path = inputShape.path
            shapeCopy.position = inputShape.position
            shapeCopy.anchorPoint = inputShape.anchorPoint
            print("bounding rect pre rotation: \(shapeCopy.frame)")
            print("path pre rotation: \((shapeCopy.path)!)")

            let transform = CATransform3DMakeRotation(CGFloat(75*Double.pi/180.0), 0, 0, 1)
            shapeCopy.transform = transform
            print("bounding rect post rotation:\(shapeCopy.frame)")
            print("path post rotation: \((shapeCopy.path)!)")
            if ((shapeCopy.path)!.contains(newPoint)) {
                containingView.layer.addSublayer(shapeCopy)
                answer = index
                print("Prize is:\(String(describing: textLabelList[index].text))")
                break
            }

调试器中的消息:

边界矩形预旋转:(139.075809065823, 236.846930318145, 174.164592138914, 163.153069681855)
路径预旋转:路径 0x600000236a60:
移至 (207, 400)
lineto (138.901, 266.349)
曲线到 (196.803, 236.847) (267.115, 247.983) (313.066, 293.934)
lineto (207, 400)
关闭路径

边界矩形柱旋转:(189.419925763055, 292.163148046286, 202.670877072107, 210.457199272682)
旋转后的路径:路径 0x600000236a60:
移至 (207, 400)
lineto (138.901, 266.349)
曲线到 (196.803, 236.847) (267.115, 247.983) (313.066, 293.934)
lineto (207, 400)
关闭路径

模拟器截图:

Screen shot of the simulator 在屏幕截图中,您将看到旋转的路径和深色饼图和略微半透明的框架中的路径框架。

但是路径的坐标没有改变。所以程序认为红点属于被旋转掉的阴影切片!如果路径更新正确,红点将属于标记为“e6 ¢”的黄色切片,给出错误答案。

还请注意,背景幸运轮是其自身坐标系中的视图等。旋转的深色饼图和红点一样位于顶层视图的坐标系中。

不确定帖子是否完全清楚 - 提前为这篇冗长的帖子道歉。如果我遗漏了任何可以提供帮助的细节,请告诉我。

提前谢谢....

【问题讨论】:

    标签: swift rotation calayer


    【解决方案1】:

    对图层应用变换不会改变图层内容的存储方式。如果图层包含图像,则图像不旋转存储,如果图层包含路径,则路径不旋转存储。

    相反,当窗口服务器构建(“合成”)屏幕图像时,它会在将图层内容绘制到帧缓冲区时应用变换。

    frame 属性不同。它实际上是根据其他几个属性计算得出的:positionbounds.sizeanchorPointtransform

    您想测试一个点是否在图层路径的屏幕外观内——即应用了变换的路径。

    一种方法是将点转换为图层的坐标系。要转换它,您还需要知道该点的原始坐标系。然后你可以使用-[CALayer convertPoint:fromLayer]-[CALayer convertPoint:toLayer:]。例如,假设您有一个点击手势识别器,并且您想知道点击是否在路径内:

    @IBAction func tapperDidFire(_ tapper: UITapGestureRecognizer) {
        let newPoint = tapper.location(in: view)
        let newPointInShapeLayer = shapeLayer.convert(newPoint, from: view.layer)
        if shapeLayer.path?.contains(newPointInShapeLayer) ?? false {
            print("Hit!")
        }
    }
    

    【讨论】:

    • 非常感谢罗布。那行得通!有什么地方可以阅读更多关于这些东西的文档吗?
    猜你喜欢
    • 2012-07-14
    • 1970-01-01
    • 2016-05-27
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多