Я новичок в 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 (путь) не доступен.Мне не очень понятна концепция границ.
Это то, что я получаю в качестве вывода для моего кода выше.
Вывод для кода
Я потратил довольно много времени и прочитал много решений, но ни одно из них, похоже, не работает.Не могли бы вы помочь мне понять, что я делаю неправильно?Я постараюсь выяснить остальное.