在位置之前为 UILabel 尺寸设置动画

Posted

技术标签:

【中文标题】在位置之前为 UILabel 尺寸设置动画【英文标题】:Animate UILabel dimension before position 【发布时间】:2013-10-23 15:22:43 【问题描述】:

我正在尝试通过三个步骤将两个 UIView(一个 UIImageView 和一个 UILabel)一起制作动画: 0) 两个视图都在屏幕的左上角 1)然后我更改框架(以及标签字体大小),使视图变得更大并位于中心 2)我再次更改框架(以及标签字体大小)以将两个视图放在右下角。 (此动画在几秒钟后开始) 3) 我从 superview 中删除了两个视图。

UIImageView 在每个动画之后都是完美的。对于 UILabel,第一个动画作品,第二个没有! 第一次动画后,我的标签立即变小,延迟后它像图像视图一样移动。我不知道为什么!我使用“setFrame”来改变原点和大小..

我的代码是:

@implementation Animazione

  UIImageView * imageView;
  UILabel * message;

-(void) startAnimationOn: (UIView *) superView;

    UIImage * image = [UIImage imageNamed:@"..."];
    imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,100,100)];
    [imageView setImage:image];
    [superView imageView];
    CGRect startRect = [self startDimension]; //make a CGRect
    [imageView setFrame:startRect];


    message = [[UILabel alloc] init];
    message.text = @"A text";
    message.textAlignment = NSTextAlignmentCenter;
    message.adjustsFontSizeToFitWidth = YES;
    [self setLabelSize: startRect];

    [message setBackgroundColor:[UIColor greenColor]]; 

    [superView addSubview:message];


    [UIView animateWithDuration:2.0
                          delay:3.0
                        options:(UIViewAnimationCurveEaseInOut|UIViewAnimationOptionAllowUserInteraction|UIViewAnimationOptionBeginFromCurrentState)
                     animations:^
                         [UIView setAnimationDelegate:self];
                         [UIView setAnimationDidStopSelector:@selector(hideViews:finished:context:)];

                         CGRect big = [self bigDimension];
                         [imageViews setFrame:big];
                         //  [self setLabelSize:big];
                         [message setFrame:big];

                     
                     completion:^(BOOL finished)
                         NSLog(@"grande");

                     ];




  -(void) hideViews:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
 
    [UIView animateWithDuration:3.0
                          delay:5.0
                        options:(UIViewAnimationCurveEaseInOut|UIViewAnimationOptionAllowUserInteraction)
                     animations:^

                         [UIView setAnimationDelegate:self];
                         [UIView setAnimationDidStopSelector:@selector(deliteViews:finished:context:)];

                         CGRect finally = [self finallyDimension];
                         [imageView setFrame:finally];
                       //  [self setLabelSize:finally];
                         [message setFrame:finally];

                     
                     completion:^(BOOL finished)
                         NSLog(@"scomparso");
                     ];




-(void) deliteViews:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context

    [imageView removeFromSuperview];
    [message removeFromSuperview];
    imageView = nil;
    message = nil;




- (void)setLabelSize: (CGRect) originalDim

[message setFrame: originalDim];
message.font = [message.font fontWithSize:originalDim.size.height/8+10];

编辑:

实际上,我并没有很好地解释我对动画的期望以及它们的作用。 对于第一个动画,我希望: - 没有 3 秒(延迟) - 图像视图和标签同时增长和移动(持续时间 2 秒) 它发生了。

对于第一个动画,我希望: - 5 秒内什么都没有(延迟) - 图像视图和标签变小并同时移动(持续时间 3 秒) 真正发生了什么: - 标签立即改变尺寸 - 没有 5 秒 - imageview变小并移动,标签移动

【问题讨论】:

不相关,但我的眼睛哭了,因为try/catch跳舞你正在做的所有事情。如果您想捕获每个未捕获的异常以进行日志记录,只需使用 NSSetUncaughtExceptionHandler 设置异常处理程序 当您说“第一个动画有效但第二个无效”时,您的意思并不清楚。详细说明究竟会发生什么(或没有发生)。 非常感谢@Gabriele !!!我编辑了我的问题,我希望它更清楚 【参考方案1】:

尝试 1: 尝试将这些设置设置为您的标签:

[label setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];
[label setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];

它会避免它被框架压缩(但不会变大)。

尝试 2:

尝试使用 UITextView 而不是 UILabel,可能会更好,因为 UITextView 使用可能不会立即调整大小的 contentView。

【讨论】:

我试了一下,但行为是一样的:( 尝试使用 UITextView 而不是 UILabel,可能会更好,因为 UITextView 使用的 contentView 可能不会立即调整大小。 事实上,我已经这样做了(我编辑了这个答案;))我很高兴它有效:D

以上是关于在位置之前为 UILabel 尺寸设置动画的主要内容,如果未能解决你的问题,请参考以下文章

如何为 UILabel 字体更改设置动画?

目标C:编写一个函数来返回UILabel中最后一个字符的位置?

动画 UIlabel 设置标题,即使我设置相同的字符串

在 Swift 中使用 CoreAnimation 为 UILabel 元素设置动画

按下按钮时未从数组中填充 UILabel

如何使用自动布局约束为移动 UILabel 设置动画?