围绕其中心旋转CAShapeLayer

时间:2019-06-30 13:49:54

标签: swift rotation uibezierpath cashapelayer anchorpoint

我是iOS的新手,我正在尝试在视图中绘制类似于跷跷板的结构。我想绕其中心旋转以表示跷跷板的运动。

The straight seesaw - the view I have now

我已使用UIBezierPath和CAShapeLayer将其绘制为一条线。我发现我们可以使用CATransform3DRotate旋转shapelayer。 但是,它不会绕其中心旋转,而是绕另一个点旋转。

我的lineShapeLayer的中心是(屏幕宽度/2,0.75 *屏幕高度)。

我打印了形状的锚点,发现[0.5,0.5]

我尝试将锚点设置为[0.5,0.75],但徒劳无功。它不会改变任何东西。

我在同一视图内的绘图函数中绘制了一个三角形和两个圆,并且将进度条添加为单独的视图。

 class SeeseawView: UIView {

        var width:CGFloat!
        var height:CGFloat!
        .
        .
        var lineShapeLayer: CAShapeLayer!

        override init(frame: CGRect) {
            super.init(frame: frame)

            self.width = self.frame.width
            self.height = self.frame.height          
            self.backgroundColor = UIColor.white
        }

        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }

     override func draw(_ rect: CGRect) {

            self.lineShapeLayer = drawLine()
            layer.addSublayer(lineShapeLayer)

            // let offsetX = self.bounds.width * (width/2 - width/2)
           // let offsetY = self.bounds.height * ((0.75 * height) - height/2)
          // self.lineShapeLayer.transform = CATransform3DMakeTranslation(-offsetX,-offsetY, 0)



           // self.lineShapeLayer.bounds = self.bounds
          //  self.lineShapeLayer.anchorPoint = CGPoint(x: 0.5,y: 0.75)
            UIView.animate(withDuration: 0.1, animations: ({

                self.lineShapeLayer.transform = CATransform3DRotate(self.lineShapeLayer.transform, 30.degreesToRadians, 0, 0, -1)

           }))

            print(lineShapeLayer.anchorPoint)   // prints [0.5,0.5]
            print(lineShapeLayer.bounds)        // prints[0,0,0,0]


        }




        func drawLine() -> CAShapeLayer{

            let linePath = UIBezierPath()
            linePath.move(to: CGPoint(x:20, y: 0.65 * height))     // #1
            linePath.addLine(to: CGPoint(x: width - 20, y: 0.65 * height))


            let shapeLayer = CAShapeLayer()
            CATransform3DRotate(self.lineShapeLayer.transform, 30.degreesToRadians, 0, 0, -1)

            shapeLayer.fillColor = UIColor.lightGray.cgColor
            shapeLayer.strokeColor = UIColor.lightGray.cgColor
            shapeLayer.lineWidth = 12.50
            shapeLayer.lineCap = kCALineCapRound
            shapeLayer.lineJoin = kCALineJoinRound
            shapeLayer.path = linePath.cgPath

            shapeLayer.shadowOpacity = 0.1


            return shapeLayer
        }


    }
extension Int{
 // function to convert Int to Radians
}

lineShapeLayer的边界为[0,0,0,0]。由于我也在同一视图中绘制其他形状,因此我不知道是否可以将其设置为等于视图的边界。 UIView.animate也无法正常工作。 我正在使用Swift 3,并且CGPathGetPathBoundingBox(path)不可用。 我对界限的概念还不太清楚。

这是我上面的代码的输出。

Output for the code

我已经花了很多时间并通读了许多解决方案,但是似乎没有一个起作用。 您能帮我了解我做错了什么吗?我会尝试找出其余的。

0 个答案:

没有答案