Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIView按预期的持续时间设置setBackgroundColor的动画。然而,UILabel会立即发生。为什么?_Ios_Objective C Blocks_Uiviewanimation_Animatewithduration - Fatal编程技术网

Ios UIView按预期的持续时间设置setBackgroundColor的动画。然而,UILabel会立即发生。为什么?

Ios UIView按预期的持续时间设置setBackgroundColor的动画。然而,UILabel会立即发生。为什么?,ios,objective-c-blocks,uiviewanimation,animatewithduration,Ios,Objective C Blocks,Uiviewanimation,Animatewithduration,我想要实现的是:拥有多个UILabel并能够按顺序高亮显示它们,我的意思是我想更改它们的textColor、fontSize和位置。因此,我已经成功地编写了一个演示,它采用了一组UIView并按顺序高亮显示它们(更改它们的背景色) 阅读了Andrew Fuchs对提到的问题的回答 然而,当我在代码中将UILabel替换为UIView时,一切都会结束,并且它们没有动画,更改会立即发生。谁能告诉我我做错了什么?UILabel是UIView的一个子类,所以我希望在UIView中工作的属性也能在UILa

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

阅读了Andrew Fuchs对提到的问题的回答

然而,当我在代码中将UILabel替换为UIView时,一切都会结束,并且它们没有动画,更改会立即发生。谁能告诉我我做错了什么?UILabel是UIView的一个子类,所以我希望在UIView中工作的属性也能在UILabel中工作。在苹果的“iOS的视图编程指南-动画”中,有一个声明说背景色可以被动画化。所以我回到了基础,编写了一些测试代码,发现对于UIView,我可以很高兴地为它的背景色、alpha和中心位置设置动画。虽然UILabel alpha属性和中心位置可以成功设置动画,但它不能设置backgroundColor和textColor。见:

我看过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方法?或者最好的方法是什么?

您可以尝试通过动画更改uilabel颜色。上面你已经实现了这个,但是需要一些改变。你也可以试试这个

[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来设置标签动画。颜色更改代码将在检查“如果完成”之后和“下一个动画”开始块之前出现。

Hah。好地方。我回家后得试试这个。我已经为视图的颜色设置了很多次动画,但不记得是否做过标签。我自己来试试。我没遇到过这个问题。我喜欢使用transitionWithView和CrossColor的想法,我刚刚尝试过,它与textColor和backgroundColor配合得很好。fontSize不太好,所以我要研究adamsiton的CATextLayer选项。好的,我已经下载了[project],它看起来不错,文本动画发生得很快,太快了。但是,当我尝试增加animateSize的持续时间时,它没有任何效果,这很奇怪。我将不得不进一步研究。
[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];
}];