如何使用计时器重复调用方法(重新加载...)以动画转换

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];
    }
}