当前位置: 首页 > 知识库问答 >
问题:

UIView按照预期使用动画和持续时间对setBackground Color进行动画处理。但是,UILabel会立即发生。为什么?

孟浩然
2023-03-14

我想要实现的是:拥有几个UILabel并能够按顺序高亮显示它们,我的意思是我想更改它们的textColor、fontSize和位置。因此,我成功地编写了一个演示,它采用一组UIView并按顺序突出显示它们(更改其背景颜色)。

阅读了Andrew Fuchs对问题的回答后,您知道执行几个连续UIView动画的最佳方式吗?引用了多个没有嵌套块的UIView动画

然而,当我在我的代码中用UILabel代替UIView时,一切都结束了,它们没有动画,变化会立即发生。有人能告诉我我做错了什么吗?UILabel是UIView的子类,所以我希望在UIView中工作的属性在UILabel中工作。在Apple的“iOS视图编程指南-动画”中,声明background Color可以动画。所以我回到了基础,编写了一些测试代码,发现对于UIView,我可以愉快地对其background Color、alpha和中心位置进行动画处理。而UILabel alpha属性和中心位置可以成功地进行动画处理,但background Color和text Color不能。请参阅:GitHub AnimateSequally

- (void)viewDidLoad {
    [super viewDidLoad];

    duration = 2.0;
    yOffset = 100.0;
    normalColor = [UIColor lightGrayColor];
    highlightedColor = [UIColor greenColor];
    view1StartPoint = view1.center;
    view2StartPoint = view2.center;
    lable1StartPoint = label1.center;
    lable2StartPoint = label2.center;
    [self resetEverything:nil];
}

- (IBAction)animateViews:(id)sender
{
    [UIView animateWithDuration:duration
                     animations:^{
                         [view1 setBackgroundColor:highlightedColor];       // animates correctly
//                         [view1 setAlpha:0.2];                              // animates correctly
                         CGPoint p = view1.center;
                         p.y -= yOffset;
                         view1.center = p;                                 // animates correctly
                     }
                     completion:^(BOOL finished){
                         [UIView animateWithDuration:duration
                                          animations:^{
                                              [view2 setBackgroundColor:highlightedColor];
//                                              [view2 setAlpha:0.2];
                                              CGPoint p = view2.center;
                                              p.y -= yOffset;
                                              view2.center = p;                                 // animates correctly
                                          }
                                          completion:nil];
                     }
     ];
}

- (IBAction)animateLabelsSimple:(id)sender      // does NOT works sequentially
{
    [UIView animateWithDuration:duration
                     animations:^{
                         [label1 setBackgroundColor:highlightedColor];      // changes instantly
//                         [label1 setTextColor:[UIColor orangeColor]];       // changes instantly
//                         [label1 setAlpha:0.2];                             // animates correctly
                         CGPoint p = label1.center;
                         p.y -= yOffset;
                         label1.center = p;                                 // animates correctly
                     }
                     completion:^(BOOL finished){
                         [UIView animateWithDuration:duration
                                          animations:^{
                                              [label2 setBackgroundColor:highlightedColor];
//                                              [label2 setTextColor:[UIColor orangeColor]];
//                                              [label2 setAlpha:0.2];
                                              CGPoint p = label2.center;
                                              p.y -= yOffset;
                                              label2.center = p;
                                          }
                                          completion:nil];
                     }
     ];
}

- (IBAction)resetEverything:(id)sender
{
    [view1 setBackgroundColor:normalColor];
    [view2 setBackgroundColor:normalColor];
    [label1 setBackgroundColor:normalColor];
    [label2 setBackgroundColor:normalColor];

    [view1 setAlpha:1.0];
    [view2 setAlpha:1.0];
    [label1 setAlpha:1.0];
    [label2 setAlpha:1.0];

    [label1 setTextColor:[UIColor blackColor]];
    [label2 setTextColor:[UIColor blackColor]];

    view1.center = view1StartPoint;
    view2.center = view2StartPoint;
    label1.center = lable1StartPoint;
    label2.center = lable2StartPoint;
}

我查看了GitHub Chameleon项目,并了解了UIView类方法“animateWithDuration”可能是如何实现的:

+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion
{
    [self _beginAnimationsWithOptions:options | UIViewAnimationOptionTransitionNone];
    [self setAnimationDuration:duration];
    [self setAnimationDelay:delay];
    [self _setAnimationCompletionBlock:completion];

    animations();

    [self commitAnimations];
}

那么,我必须将UILabel子类化并重写animateWithDuration方法吗?或者最好的方法是什么?

共有1个答案

高慈
2023-03-14

你可以试试这个https://stackoverflow.com/a/20892927/4030971用动画改变uilabel颜色。上面你已经实现了这个,但是需要一些changes.also你可以试试这个

[UIView animateWithDuration:duration animations:^{
     [view1 setBackgroundColor:highlightedColor];       
     [view1 setAlpha:0.2];
     [label setAlpha:0.0];                             
     CGPoint p = view1.center;
     p.y -= yOffset;
     view1.center = p;
}completion:^(BOOL finished){
     if(finished){
         [label setBackgroundColor:[UIColor redColor]];
         [UIView animateWithDuration:duration animations:^{
             [view2 setBackgroundColor:highlightedColor];
             [view2 setAlpha:0.2];
             [label setAlpha:1.0];
             CGPoint p = view2.center;
             p.y -= yOffset;
             view2.center = p;
         }completion:nil];
}];

可以在标签的alpha为0时编写标签颜色更改代码,之后可以通过使alpha为1来设置标签动画。颜色更改代码将在检查“如果完成”之后和“下一个动画”开始块之前。

 类似资料:
  • 我在动画制作方法上有问题 我已经为GoogleMap创建了自己的CalloutBubble 在我的视图控制器中,我创建属性 然后,如果我尝试用任何方法创建calloutView,所有这些都可以很好地处理动画,但如果我用Google map方法返回视图 我的动画会立即在calloutView中运行,也会立即调用completion,然后再次调用runningLabel方法,因此它不会像必须的那样工作

  • 我想安排一系列动画,在屏幕上动画介绍文字。最后一个动画在完成时,应该触发运行游戏的游戏勾号逻辑。 出于某种原因,一切都在立即发生。有人能解释为什么会发生这种情况吗?或者有更好的选择吗?

  • 标准的块非常适合需要单个动画效果的动画,即调整大小和/或移动。 是否有一种方法可以使动画渐进,使动画开始缓慢,并随着其进展而提高速度? 我可以尝试嵌套的

  • 我想这样做:https://storage.googleapis.com/spec-host/mio-staging/mio-design/1563837804615/assets/1XlKhaQFU9aS84ACmF-EDjVKDgI4pPldv/02-overflowmenu.mp4 我想挤压一个“ViewGroup”,正如你在视频中看到的。与此同时,我想淡出ViewGroup中的内容在其原始

  • 我想在我正在写的一个应用程序中取得效果,也许你能帮我。 视图层次结构在这一点上相当复杂,所以为了简单起见,让我们假设我有一个UILabel,其Alpha值设置为0。目前,我正在使用一个UILongPressGestureRecognitor,它在几秒钟后调用一个方法来更新UILabel的文本,并执行一个UIView动画块来很好地显示它(在1秒的时间内将Alpha设置回1——淡入)。 该块在新更新的

  • 我不知道如何在iOS7中设置NSLayoutConstraint动画持续时间。这是我的代码: