我是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)不可用。 我对界限的概念还不太清楚。
这是我上面的代码的输出。
我已经花了很多时间并通读了许多解决方案,但是似乎没有一个起作用。 您能帮我了解我做错了什么吗?我会尝试找出其余的。