如何使用计时器重复调用方法(重新加载...)以动画转换
How to repeatedly call a method (reload...) with a timer to animate a transition
我在我的 xcode
项目中实现了 corePlot
。我正在尝试 "explode" 饼图的一部分 和 动画。这是我正在使用的方法:
- (void)radialOffsetForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger)idx
{
if (myIndex == idx) {
return 20;
}
return 0;
}
我有另一个调用 [pieChart reloadRadialOffset];
的方法。
例如:
- (void)thisMethod {
[pieChart reloadRadialOffset];
}
如何为 reloadRadialOffsets
设置动画?
你的问题有点混乱。你的问题标题说 "how to reaptedly call a mathod using timer" 并且在你的问题结束时它变为 "How can I animate the reloadRadialOffsets?".
要重复调用一个方法,您可以使用以下任何选项
选项 1.
[NSTimer scheduledTimerWithTimeInterval:1.0
target:self
selector:@selector(animatedPie:)
userInfo:nil
repeats:YES];
选项 2:
[self performSelector:@seletor(animatePie) withObject:nil afterDelay:1.0];
在你的方法中
-(void) animatePie
{
[UIView animateWithDuration:1.0 animations:^
{
[pieChart reloadRadialOffsets];
} completion:^(BOOL finished)
{
[self performSelector:@seletor(animatePie) withObject:nil afterDelay:1.0];
}];
}
此处repeated 方法将在动画完成后延迟调用agian。
当你想停止动画调用时
- (void)cancelPerformSelector:(SEL)aSelector target:(id)target argument:(id)arg
当使用计时器时,一旦间隔结束,它就会被触发。
动画
您可以使用
[UIView animateWithDuration:1.0 animations:^
{
} completion:^(BOOL finished) {
}];
或用户
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:key];
您可以使用以下代码。在此 UIViewAnimationOptionRepeat 中有助于重复动画您想要实现的目标..
[UIView animateWithDuration:5
delay:1
options:UIViewAnimationOptionCurveEaseIn | UIViewAnimationOptionRepeat
animations:^{
[UIView setAnimationRepeatCount:2];
[pieChart reloadRadialOffsets];
}
completion:nil];
//你还想用定时器调用方法
NSTimer *animateTimer;
animateTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self
selector:@selector(thisMethod) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:animateTimer forMode:NSDefaultRunLoopMode];
[animateTimer fire];
- (void)thisMethod {
[pieChart reloadRadialOffsets];
}
希望对您有所帮助...!
我刚刚在 Plot Gallery 示例应用中的 "Simple Pie Chart" 演示中添加了一个示例。我向控制器添加了两个属性来保存所选切片的索引和所需的偏移值。由于偏移量是 CGFloat
,因此很容易使用 Core Animation 或 CPTAnimation
.
进行动画处理
将索引设置为 NSNotFound
以指示不应选择切片。如果您想一次突出显示多个切片,也可以使用一个数组或一组索引。
self.offsetIndex = NSNotFound;
触发动画偏移切片:
self.offsetIndex = idx;
[CPTAnimation animate:self
property:@"sliceOffset"
from:0.0
to:35.0
duration:0.5
animationCurve:CPTAnimationCurveCubicOut
delegate:nil];
绘图数据源需要径向偏移方法:
-(CGFloat)radialOffsetForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger)index
{
return index == self.offsetIndex ? self.sliceOffset : 0.0;
}
sliceOffset
属性需要一个自定义的setter来触发情节更新动画期间的偏移量:
-(void)setSliceOffset:(CGFloat)newOffset
{
if ( newOffset != sliceOffset ) {
sliceOffset = newOffset;
[self.graphs[0] reloadData];
}
}
我在我的 xcode
项目中实现了 corePlot
。我正在尝试 "explode" 饼图的一部分 和 动画。这是我正在使用的方法:
- (void)radialOffsetForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger)idx
{
if (myIndex == idx) {
return 20;
}
return 0;
}
我有另一个调用 [pieChart reloadRadialOffset];
的方法。
例如:
- (void)thisMethod {
[pieChart reloadRadialOffset];
}
如何为 reloadRadialOffsets
设置动画?
你的问题有点混乱。你的问题标题说 "how to reaptedly call a mathod using timer" 并且在你的问题结束时它变为 "How can I animate the reloadRadialOffsets?".
要重复调用一个方法,您可以使用以下任何选项
选项 1.
[NSTimer scheduledTimerWithTimeInterval:1.0
target:self
selector:@selector(animatedPie:)
userInfo:nil
repeats:YES];
选项 2:
[self performSelector:@seletor(animatePie) withObject:nil afterDelay:1.0];
在你的方法中
-(void) animatePie
{
[UIView animateWithDuration:1.0 animations:^
{
[pieChart reloadRadialOffsets];
} completion:^(BOOL finished)
{
[self performSelector:@seletor(animatePie) withObject:nil afterDelay:1.0];
}];
}
此处repeated 方法将在动画完成后延迟调用agian。
当你想停止动画调用时
- (void)cancelPerformSelector:(SEL)aSelector target:(id)target argument:(id)arg
当使用计时器时,一旦间隔结束,它就会被触发。
动画
您可以使用
[UIView animateWithDuration:1.0 animations:^
{
} completion:^(BOOL finished) {
}];
或用户
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:key];
您可以使用以下代码。在此 UIViewAnimationOptionRepeat 中有助于重复动画您想要实现的目标..
[UIView animateWithDuration:5
delay:1
options:UIViewAnimationOptionCurveEaseIn | UIViewAnimationOptionRepeat
animations:^{
[UIView setAnimationRepeatCount:2];
[pieChart reloadRadialOffsets];
}
completion:nil];
//你还想用定时器调用方法
NSTimer *animateTimer;
animateTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self
selector:@selector(thisMethod) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:animateTimer forMode:NSDefaultRunLoopMode];
[animateTimer fire];
- (void)thisMethod {
[pieChart reloadRadialOffsets];
}
希望对您有所帮助...!
我刚刚在 Plot Gallery 示例应用中的 "Simple Pie Chart" 演示中添加了一个示例。我向控制器添加了两个属性来保存所选切片的索引和所需的偏移值。由于偏移量是 CGFloat
,因此很容易使用 Core Animation 或 CPTAnimation
.
将索引设置为 NSNotFound
以指示不应选择切片。如果您想一次突出显示多个切片,也可以使用一个数组或一组索引。
self.offsetIndex = NSNotFound;
触发动画偏移切片:
self.offsetIndex = idx;
[CPTAnimation animate:self
property:@"sliceOffset"
from:0.0
to:35.0
duration:0.5
animationCurve:CPTAnimationCurveCubicOut
delegate:nil];
绘图数据源需要径向偏移方法:
-(CGFloat)radialOffsetForPieChart:(CPTPieChart *)pieChart recordIndex:(NSUInteger)index
{
return index == self.offsetIndex ? self.sliceOffset : 0.0;
}
sliceOffset
属性需要一个自定义的setter来触发情节更新动画期间的偏移量:
-(void)setSliceOffset:(CGFloat)newOffset
{
if ( newOffset != sliceOffset ) {
sliceOffset = newOffset;
[self.graphs[0] reloadData];
}
}