Вращать CAShapeLayer вокруг его центра - PullRequest
0 голосов
/ 30 июня 2019

Я новичок в iOS и пытаюсь нарисовать структуру, похожую на качели.Я хочу повернуть его вокруг своего центра, чтобы представить движение качелей.

Прямые качели - вид, который у меня сейчас есть

Я нарисовал его в виде линиииспользуя UIBezierPath и CAShapeLayer.Я обнаружил, что мы можем вращать слой формы, используя CATransform3DRotate.Однако он вращается не вокруг своего центра, а в другой точке.

Центр моего 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 (путь) не доступен.Мне не очень понятна концепция границ.

Это то, что я получаю в качестве вывода для моего кода выше.

Вывод для кода

Я потратил довольно много времени и прочитал много решений, но ни одно из них, похоже, не работает.Не могли бы вы помочь мне понять, что я делаю неправильно?Я постараюсь выяснить остальное.

...