我有一个简单的自定义UIView(一个矩形),用drawRect实现。
视图来自两个值; currentValue和maxValue
来自drawRect:
rect的高度表示currentValue的maxValue:
if(currentValue > maxValue)
currentValue = maxValue;
float scale = currentValue/maxValue;
//Draw the rect
CGContextBeginPath(context);
CGContextMoveToPoint(context, self.bounds.origin.x, self.bounds.size.height);
CGContextAddLineToPoint(context, self.bounds.size.width, self.bounds.size.height);
CGContextAddLineToPoint(context, self.bounds.size.width, self.bounds.size.height-(self.bounds.size.height*scale));
CGContextAddLineToPoint(context, self.bounds.origin.x, self.bounds.size.height-(self.bounds.size.height*scale));
CGContextClosePath(context);
CGContextSetRGBFillColor(context, 1.0, 0.0, 0.0, 1.0);
CGContextFillPath(context);
CGContextStrokePath(context);
我已经设置了一个带有UISlider的ViewController,它可以更改currentValue,每次更改setNeedsDisplay都会被调用。这部分工作正常。使用滑块时,rect会根据计划完全改变高度。
我的问题是...... 我希望这种高度之间的过渡能够被动画化。最好的方法是什么?
由于
答案 0 :(得分:1)
您可以将CAShapeLayer
对象添加到视图的图层,而不是使用自定义绘图的UIView。 CAShapeLayer
类允许指定绘制和绘制属性的路径 - 并且这些属性的更改也很容易实现。
如果您的视图只是一个填充纯色的矩形,那么您的第二个选项是调整视图的帧或设置适当的仿射变换以获得所需的高度 - 这两个属性也可以使用{{1}中的动画方法轻松制作动画} class。
答案 1 :(得分:1)
如果你真的只想要一个可以由核心动画层(如CAShapeLayer
或CAGradientLayer
)绘制的简单形状,你应该只使用核心动画层和CABasicAnimation
为图层的框架设置动画。
如果您打算绘制更复杂的东西,并且想要对形状进行动画处理,那么您需要做更多的工作。您需要提供对象属性或实例变量来存储当前值和最终值,并可能存储值的速度。您需要创建一个CADisplayLink
对象并使用它来驱动对动画方法的调用。您的动画方法应根据已经过去的时间更新当前值,然后调用setNeedsDisplay
。
答案 2 :(得分:0)
您可能希望使用Core Animation执行此操作。相关文档在Apple的developer site上。在此other SO question上,Core Animation与iOS之间也有很好的链接来源。