使用drawrect定制UIView动画

时间:2015-03-12 19:43:46

标签: ios objective-c swift animation uiview

我在故事板中创建了一个UIView,并且我链接到一个名为" XXX"的自定义UIView类。在drawRect中我已经编写了代码来填充XXX中的颜色。从我的视图控制器我试图动画UIView。 XXX(UIView)中的填充颜色正在发生,但没有动画。这是我的代码。

class XXX: UIView {

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

override func drawRect(rect: CGRect) {
var context: CGContextRef = UIGraphicsGetCurrentContext()!
CGContextClearRect(context, rect)
let color = UIColor.greenColor().CGColor
CGContextSetFillColorWithColor(context, color)
CGContextAddRect(context, rect)
CGContextFillPath(context)
}


myviewcontroller.swift
@IBOutlet var xxxView: XXX!

 override func viewDidLoad() {
        super.viewDidLoad()

        XXX.animateWithDuration(1.0, delay: 0, options:
            UIViewAnimationOptions.Repeat, animations: { () -> Void in
                XXX.setAnimationDuration(1.0)
                self.xxxView = XXX (frame: CGRectMake(0, 0, 100, 100))

            },completion: nil);
    }

我在视图控制器动画中出错的地方。无法弄明白。那么,如何动画自定义UIView?或如何为drawrect的内容设置动画?

注意:调用了drawRect,并且rect填充了颜色但没有动画。 我之前的方法是在控制器中创建一个UIView,并通过动画增加宽度。但是,它没有被团队接受。像下面这样的东西,工作正常。

var xxxView = UIView()
xxxView.frame = CGRectMake(0, 10, startingPoint, 20)
xxxView.backgroundColor = UIColor.greenColor()

UIView.animateWithDuration(1.0, delay: 0, options:
            UIViewAnimationOptions.Repeat, animations: { () -> Void in
            UIView.setAnimationDuration(3.0)

            let totalWidth: CGFloat = 50
            let animationWidth: CGFloat = totalWidth - startingPoint

            var frame : CGRect = xxxView.frame;
            frame.size.width = (startingPoint + animationWidth)
            xxxView.frame = frame;
            },completion: nil);

谢谢!

3 个答案:

答案 0 :(得分:1)

<强>更新  我现在看到你在问什么,我起初误会了。你想要动画填充UIView而不实际制作视图动画(不知道为什么)。

在drawRect内部而不是使用提供的rect变量,使用自定义&#34; currentHeight&#34;创建自己的。变量值为0,然后增加你的&#34; currentHeight&#34;使用动画块或计时器变量直到它已满。

您可以使用CADisplayLink调用函数来调用&#34; setNeedsDisplay&#34;为了触发重绘作为动画,自定义变量不会触发对绘图的更新(尽管也许你可以动画另一个变量来触发它,它很邋but但可能有用)。

很抱歉,我无法提供更好的解释或示例,但我现在远离笔记本电脑。


问题是你在动画块内部创建了一个xxxView的全新实例,而不是为现有动画块设置动画。

如果您希望视图设置动画,则需要将动画块之外的现有self.xxxView(使用故事板或代码)初始化到起点和动画块内部,调整其想要设置动画的值。例如:

 override func viewDidLoad() {
    super.viewDidLoad()
    self.xxxView = XXX(frame:CGRectMake(0,0,100,100) //set starting point here or set it in storyboard
    XXX.animateWithDuration(1.0, delay: 0, options:
        UIViewAnimationOptions.Repeat, animations: { () -> Void in
            XXX.setAnimationDuration(1.0)
            self.xxxView.alpha = 1

        },completion: nil);
}

此代码将初始化一个alpha为0的视图,然后将其设置为1的alpha值,持续时间为1秒。

如果您希望它看起来好像视图用颜色填充,您可以使用调整视图大小的技巧。这与在动画块中操纵现有视图属性的概念相同。

示例:

override func viewDidLoad() {
 super.viewDidLoad()
    self.xxxView = XXX(frame:CGRectMake(0,0,0,0) //set starting point here or set it in storyboard
    self.xxxView.alpha = 0 
    XXX.animateWithDuration(1.0, delay: 0, options:
        UIViewAnimationOptions.Repeat, animations: { () -> Void in
            XXX.setAnimationDuration(1.0)
            self.xxxView.frame = CGRectMake(0,0,100,100)

        },completion: nil);
}

答案 1 :(得分:0)

我认为你的问题是当视图加载时,它已经加载了动画。当视图出现时,您希望它具有动画效果。尝试将其放在override func viewDidAppear()。

答案 2 :(得分:0)

如果您只需要动画更改UIView的颜色,那么最简单的方法是使用backgroundColor属性并在动画块中更改它,如下所示:

UIView.animateWithDuration(duration:1.0, animations:{ () -> Void in
    myView.backgroundColor = UIColor.greenColor();
})

请记住,animateWithDuration func是一个类func,所以你不要在UIView的实例上调用它,而是在类本身上调用它。

就动画drawRect:方法而言,这更复杂,我无法给出明确的答案。一种选择是使用CAAnimation对象,并将其添加到视图的layer中,用于属性backgroundColor,如下所示:

var animation : CABasicAnimation = CABasicAnimation(keyPath:"backgroundColor")
animation.fromValue = myView.backgroundColor
animation.toValue = UIColor.greenColor
animation.duration = 1.0

myView.layer.backgroundColor = UIColor.greenColor.CGColor

myView.layer.addAnimation(animation, forKey:"backgroundColor")

注意:上面的代码未经测试,旨在提供一个不确定的想法。这也假设您想要从一种颜色到另一种颜色的漂亮淡入淡出动画。对于自定义动画,例如从上到下填充,您需要执行其他操作,例如添加子图层并对其大小进行动画处理。