在快速

时间:2015-08-29 03:59:48

标签: swift animation cgpath

enter image description here我对iOS很新,我面临一个关于CAKeyframeAnimation的小问题,我想将视图设置为另一个视图层的某个路径的动画。它已经成功动画了。但是,动画的位置并不是我所期望的。

正如您在我的代码中看到的那样。我创建了一个带有圆形边界的UIView(myView)。我希望另一个视图(正方形)跟随myView边界的轨道。我已经将myView的中心设置为屏幕中间。然后我尝试获取myView的CGPath并将其设置为CAKeyframeAnimation的路径。但是,正方形在其他地方旋转,而不是在myView的边界上。谁能帮助我?感谢

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)    
    let square = UIView()
    square.frame = CGRect(x: 0, y: 0, width: 20, height: 20)
    square.backgroundColor = UIColor.redColor()
    self.view.addSubview(square)
    let bounds = CGRect(x: 0, y: 0, width: 200, height: 200)
    let myView = UIView(frame: bounds)
    myView.center = self.view.center
    myView.layer.cornerRadius = bounds.width/2
    myView.layer.borderWidth = 10
    myView.layer.borderColor = UIColor.brownColor().CGColor
    self.view.addSubview(myView)       
    var orbit = CAKeyframeAnimation(keyPath: "position")
    orbit.path = CGPathCreateWithEllipseInRect(myView.layer.bounds, nil)
    orbit.rotationMode = kCAAnimationRotateAuto
    orbit.repeatCount = Float.infinity
    orbit.duration = 5.0
    square.layer.addAnimation(orbit, forKey: "orbit")
}

2 个答案:

答案 0 :(得分:2)

frame"在超视图的坐标系中描述视图的位置和大小,"而bounds"描述了视图在其自己的坐标系中的位置和大小。"

因此,如果您要从bounds构建路径,则square必须是myView的子视图。如果您使用frame的{​​{1}}构建路径,那么myView可能是square的子视图。

答案 1 :(得分:0)

所以,我找到了另一个解决方案,而不是根据已经存在的某个视图创建CGPath,我用了

let myPath = UIBezierPath(arcCenter: myView.center, radius: bounds.width/2, startAngle: CGFloat(-(CGFloat(M_PI_2))), endAngle: CGFloat((2.0 * M_PI - M_PI_2)), clockwise: true).CGPath
以这种方式,我可以指定UIBezierPath的中心点。