AppleWatch循环进度(或径向弧进度)与图像错误

时间:2015-03-26 16:39:40

标签: ios objective-c iphone apple-watch

我正在使用WatchKit为Apple Watch开发应用程序,我需要在录制音频时实现循环进度,类似于Apple演示。

我不知道WatchKit是否包含了默认操作,所以我创建了自己的图像(13秒12秒[总共209 KB]),我用计时器更改了。

这是我的源代码:

开始/停止录制的按钮操作

- (IBAction)recordAction {
   NSLogPageSize();
   NSLog(@"Recording...");

   if (!isRecording) {
      NSLog(@"Start!");
      isRecording = YES;

      _timerStop = [NSTimer scheduledTimerWithTimeInterval:12.0
                                                  target:self
                                                selector:@selector(timerDone)
                                                userInfo:nil
                                                 repeats:NO];

      _timerProgress = [NSTimer scheduledTimerWithTimeInterval:1.0
                                                      target:self
                                                    selector:@selector(progressChange)
                                                    userInfo:nil
                                                     repeats:YES];
   } else {
       NSLog(@"Stop :(");
       [self timerDone];
   }

}

计时器完成时的操作或按钮上的再次点击

-(void) timerDone{
   NSLog(@"timerDone");
   [_timerProgress invalidate];
   _timerProgress = nil;
   [recordButtonBackground setBackgroundImageNamed:[NSString stringWithFormat:@"ic_playing_elipse_12_%d", 12]];
   counter = 0;
   isRecording = NO;
 }

改变进度的方法

- (void)progressChange
{
  counter++;
   NSLog(@"%d", counter);
   NSString *image = [NSString stringWithFormat:@"ic_playing_elipse_12_%d", counter];
   [recordButtonBackground setBackgroundImageNamed:image];
   NSLog(image);
}

这是显示错误的gif。它开始显示,但随机改变图像,直到它得到一对秒。 (注意:我已经检查过第一张图片是否有正确的进展)

Screen recording that shows my bug

更新(其他解决方案):使用startAnimating

使用 startAnimatingWithImagesInRange:duration:repeatCount

有一种新的方式显示圈子进度

您需要指定动画的图像范围和持续时间。请参阅以下示例:

[self.myElement startAnimatingWithImagesInRange:NSMakeRange(0, 360) duration:myDuration repeatCount:1];

2 个答案:

答案 0 :(得分:1)

我认为这是WatchKit解释图像名称的副作用。

以数字结尾的图像名称用于表示动画图像中的帧,因此“ic_playing_elipse_12_10”被解释为名为“ic_playing_eclipse_12_1”的图像的第一帧,当您希望它显示第一个图像时,会显示第10个图像之一。

您应该只需更改图片名称,这样该号码就不是图片名称的最后一部分,而是会修复它。

答案 1 :(得分:1)

我知道这个问题已得到解答,但我想更好地解释startAnimating的解决方案。

[myElement startAnimatingWithImagesInRange:NSMakeRange(imageIdBegin, imageIdEnd) duration:duration repeatCount:repetitions];

为了使用它,您需要一组名称与您想要的图像,但需要连续的ID。例如:progress_0.png,progress_1.png,progress_2.png,..,progress_n.png

您可以使用NSMakeRange(imageIdBegin,imageIdEnd)中的值来确定开始索引和结束索引,只显示数字ID(不是完整图像名称)

当然,您需要以秒为单位指示动画的持续时间,WatchKit将为您插入以在init索引和结束索引之间为图像设置动画。

最后,您可以指示是否要重复此动画(例如,对于加载操作)。如果您不想重复,则必须注明1。

我希望这可以帮助更多人在AppleWatch应用程序中执行循环进度或其他动画:)