【问题标题】:How to Animate uilabel text between 3 values如何在 3 个值之间为 uilabel 文本设置动画
【发布时间】:2014-01-10 05:16:17
【问题描述】:

我想要的是在 3 个值之间重复为我的 UILabel 文本设置动画。我要设置的文本是“正在下载。”、“正在下载……”、“正在下载……”,然后重复。通过这个动画,我想让我的用户知道下载已经完成并且应用程序没有堆叠。我用google搜索了一段时间,没有找到解决办法。

任何人都可以给我一些关于这个的参考吗?提前致谢。

【问题讨论】:

  • 这个动作有什么动听的?只需更改标签的文本即可
  • NSTimer, UILabel, 状态变量 (int), Switch case
  • 你试过 NSTimer 吗?
  • 你真好。所有的答案都有道理。

标签: ios objective-c animation uilabel


【解决方案1】:

使用 NStimer 更改文本

.h 文件中

@interface ViewController : UIViewController
{
    NSTimer * timer;
    UILabel * downloadingLbl;
}

.m 文件中

- (void)viewDidLoad
{
    [super viewDidLoad];

    downloadingLbl.text = @"Downloading.";
    if (!timer) {
        timer = [NSTimer timerWithTimeInterval:0.5 target:self selector:@selector(onTick:) userInfo:nil repeats:YES];
    }
}

-(void)onTick:(NSTimer*)timer
{
    NSLog(@"Tick...");

    if ([downloadingLbl.text isEqualToString:@"Downloading."]) {
        downloadingLbl.text = @"Downloading..";
    } else if ([downloadingLbl.text isEqualToString:@"Downloading.."]) {
        downloadingLbl.text = @"Downloading...";
    } else if ([downloadingLbl.text isEqualToString:@"Downloading..."]) {
        downloadingLbl.text = @"Downloading.";
    }
}

当您的下载完成时,会使计时器失效。

[timer invalidate];

【讨论】:

  • @Sabbath 我认为这是更合适的答案,因为您不必为流程维护另一个变量。
  • 如果您的计时器不起作用,请参阅此stackoverflow.com/a/11281235/2764966
【解决方案2】:

为此,您必须像这样安排计时器:

int count = 1;
NSTimer *myTimer = [NSTimer scheduledTimerWithTimeInterval:1
                       target:self 
                       selector:@selector(updateLabel) 
                       userInfo:nil 
                       repeats:YES];

现在下面的方法将在每个(以秒为单位)周期内被调用

- (void) updateLabel {
    if(count == 1)
    {
    label.text = @"Downloading."

    count = 2;
    }
    else if(count == 2)
    {
    label.text = @"Downloading.."

    count = 3;
    }
    else if(count == 3)
    {
    label.text = @"Downloading..."

    count = 1;
    }
}

当您想停止更新时,请执行此操作,在您想停止下载的情况下:

[timer invalidate];

【讨论】:

  • 三点下载怎么样。
  • @hckr 它是由其他人编辑的。你现在可以检查一下吗?
【解决方案3】:

更新了 Johnston 对 Swift 的回答:

ellipsisTimer = NSTimer.scheduledTimerWithTimeInterval(0.6, target: self, selector: #selector(LinkCheckViewController.updateLabelEllipsis(_:)), userInfo: nil, repeats: true)



func updateLabelEllipsis(timer: NSTimer) {
        let messageText: String = self.ThreeDotLabel.text!
        let dotCount: Int = (ThreeDotLabel.text?.characters.count)! - messageText.stringByReplacingOccurrencesOfString(".", withString: "").characters.count + 1
        self.ThreeDotLabel.text = " "
        var addOn: String = "."
        if dotCount < 4 {
            addOn = "".stringByPaddingToLength(dotCount, withString: ".", startingAtIndex: 0)
        }
        self.ThreeDotLabel.text = self.ThreeDotLabel.text!.stringByAppendingString(addOn)
    }

【讨论】:

    【解决方案4】:

    viewDidLoad:

    self.downloadingLabel.text = @"downloading.";
    
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(tick:) userInfo:nil repeats:YES];
    

    然后添加方法:

    - (void) tick:(NSTimer *) timer {
        if ([self.downloadingLabel.text isEqual: @"downloading..."])
            self.downloadingLabel.text = @"downloading.";
        else
            self.downloadingLabel.text = [self.downloadingLabel.text stringByAppendingString:@"."];
    }
    

    这将满足您的要求。虽然您可能想研究 UIActivityIndi​​catorView 之类的类;

    【讨论】:

      【解决方案5】:

      使用这个。它可能会帮助你..

      if (!timer)
      {
            timer = [NSTimer timerWithTimeInterval:0.5 target:self selector:@selector(updateLabel) userInfo:nil repeats:YES];
      }
      

      这里我添加了摇动动画来指示下载进度。 最初的抖动值是..

      self.shake = 5;
      self.direction = 1;
      
      -(void)shake:(UILabel *)theOneYouWannaShake{
          [UIView animateWithDuration:0.01 animations:^
           {
               theOneYouWannaShake.transform = CGAffineTransformMakeTranslation(5*self.directions, 0);
           }
                           completion:^(BOOL finished)
           {
               if(self.shakes >= 5)
               {
                   theOneYouWannaShake.transform = CGAffineTransformIdentity;
                   return;
               }
               self.shakes++;
               self.directions = self.directions * -1;
               [self shake:theOneYouWannaShake];
           }];
      }
      
      - (void) updateLabel {
          int status = self.count % 3;
          if(status == 0)
            {
              label.text = @"Downloading."
            }
           else if(status == 1)
           {
              label.text = @"Downloading.."
           }
           else 
          {
             label.text = @"Downloading...";
      
          } 
           self.count += 1 ;
      }
      

      下载完成后。

      [timer invalidate]
      self.count = 0;
      

      【讨论】:

      • 为什么给出与不稳定给出的答案相同的答案,请参阅@Dhaval Bhadania 答案。我认为是一样的。
      • @hckr 我没有完成我的答案。等等..?将添加动画代码。
      • 那个动画需要什么?
      • @hckr 他想了解用户的下载进度。我想,这个动画就是这样做的。
      【解决方案6】:

      我在 2015 年才来这篇文章,我对这里的答案并不满意。 这是我的解决方案。将4 更改为任意数量的点。这将做 3 个点 (4 - 1)。将单词Posting 更改为您需要的任何状态。

      首先添加一个如上所述的计时器。

      self.ellipsisTimer = [NSTimer scheduledTimerWithTimeInterval:0.6
                                                    target:self
                                                  selector:@selector(updateLabelEllipsis:)
                                                  userInfo:nil
                                                   repeats:YES]; 
      

      在您的更新方法中:

      - (void) updateLabelEllipsis:(NSTimer *)timer {
          NSString *messageText = [[self messageLabel] text];
          NSInteger dotCount = messageText.length - [[messageText stringByReplacingOccurrencesOfString:@"." withString:@""] length] + 1;
          [[self messageLabel] setText:@"Posting"];
          NSString *addOn = @".";
          if (dotCount < 4) {
              addOn = [@"" stringByPaddingToLength:dotCount withString: @"." startingAtIndex:0];
          }
          [[self messageLabel] setText:[[[self messageLabel] text] stringByAppendingString:addOn]];
      }
      

      它的工作原理是计算当前的点数并再加一个。一旦超过限制,它就会回到 1 个点。

      【讨论】:

        【解决方案7】:

        更改持续时间为 0.5 秒的 UILabel 文本动画,在数组中添加 3 个文本并一直更新,直到您的响应成功。

        用户 NSTimer 用于更新 UILabel 文本

        【讨论】:

          猜你喜欢
          • 2014-04-06
          • 2011-07-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多