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

Autolayout动画约束不会为子视图设置动画

宫弘亮
2023-03-14

我有一个UIView,其中有一个UILabel作为子视图。

现在我用动画改变UIView的宽度(改变约束的常量属性)并在UIView动画中调用layoutIfNeed...(

视图正在正常调整大小,但UILabel(子视图)将字体大小更改为“结束”大小,但没有像uiview那样正确设置动画。

根据WWDC 2012会话,如果仅更改superview的常量,则子视图应设置动画。

UILabel的最小字体比例为0,1,小于字体必须调整大小。

共有2个答案

谷梁嘉运
2023-03-14

我不认为你可以这样动画文本的大小。我能想到的唯一方法是创建标签的快照视图,将该视图添加到标签上,进行动画处理,然后删除快照视图。这段代码确实会稍微向下移动较小的文本,但它看起来很不错,当您取消隐藏标签并删除图像视图时,只需要非常小的移动。包含标签的小视图大小为185x36,标签的每一侧都有20个约束,顶部为8个,底部为7个。我在代码中将这些相同的约束添加到图像视图中。

@interface ViewController ()
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *widthCon; // width constraint on smallView
@property (weak,nonatomic) IBOutlet UIView *smallView; // view that the label is embedded in
@property (weak,nonatomic) IBOutlet UILabel *label;
@end

@implementation ViewController

- (IBAction)shrinkView:(id)sender {

    UIView *snapshot = [self.label snapshotViewAfterScreenUpdates:YES];
    [snapshot setTranslatesAutoresizingMaskIntoConstraints:NO];
    [self.smallView addSubview:snapshot];
    [self.smallView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-20-[snapshot]-20-|" options:0 metrics:nil views:@{@"snapshot":snapshot}]];
    NSLayoutConstraint *topCon = [NSLayoutConstraint constraintWithItem:snapshot attribute:NSLayoutAttributeTop relatedBy:0 toItem:self.smallView attribute:NSLayoutAttributeTop multiplier:1 constant:8];
    NSLayoutConstraint *bottomCon = [NSLayoutConstraint constraintWithItem:self.smallView attribute:NSLayoutAttributeBottom relatedBy:0 toItem:snapshot attribute:NSLayoutAttributeBottom multiplier:1 constant:7];
    [self.smallView addConstraints:@[topCon,bottomCon]];
    [self.smallView layoutSubviews];
    self.label.alpha = 0;
    self.widthCon.constant = 100;
    topCon.constant = 18;
    bottomCon.constant = 10;
    [UIView animateWithDuration:.5 animations:^{
            [self.view layoutIfNeeded];
        } completion:^(BOOL finished) {
            self.label.alpha = 1;
            [snapshot removeFromSuperview];
        }];
}

编辑后:

有一种方法可以对视图进行动画处理,以便标签也向下动画,而不是立即进入其最终大小。您必须直接使用计时器对约束进行动画处理(请参阅WWDC 2012视频“掌握自动布局的最佳实践”中大约31分钟的解释)。这可以对标签的大小进行动画处理,但字体大小的变化是跳跃的,并且看起来不太好。如果您对标签所在的视图有宽度约束(并且标签对两侧有约束),那么您可以这样做:

-(IBAction)animateSizeChange:(id)sender {
    [NSTimer scheduledTimerWithTimeInterval:.001 target:self selector:@selector(doStuff:) userInfo:Nil repeats:YES];
}

-(void)doStuff:(NSTimer *) aTimer {
    self.widthCon.constant -= .2;
    if (self.widthCon.constant <90) [aTimer invalidate];
}
任飞龙
2023-03-14

我正在努力通过更改UILabel的宽度约束来调整其大小。标签设置了调整字体大小调整宽度(adjustsFontSizeToFitWidth)和最小缩放因子(minimumScaleFactor)。

我通过将标签“contentMode设置为UIViewContentModeScaleAspectFit”来修复它。默认情况下,标签为UIViewContentModeLeft。

 类似资料:
  • 许多有关自动布局约束动画的教程建议更新约束的常量属性,然后在动画块中调用。 我的处境有点棘手。我有一个包含3个子视图的视图。此超级视图的高度不是固定的-它是按其子视图的高度之和计算的。在某些情况下,我要求这3个子视图中的一个子视图切换其高度(它在0和30之间变化,即我希望平滑地隐藏和显示它)。代码类似于此: 不幸的是,这并不像我预期的那样有效。我可以看到子视图高度的平滑变化,但在为子视图高度约束设

  • 我有两个两个文本字段displayNameTF和emailTF。 我想设置一个文本字段的动画,使其超过另一个文本字段的顶部。 我已经将emailTF的中心存储在emailTFOrigin中,我正在将displayNameTF的中心设置为它,并设置所需的布局动画。 我得到的动画是,默认情况下,文本字段彼此相距约5点,displaynameTF直接跳到emailTF的顶部,并将动画恢复到其原始位置。

  • 我在学习教程中的动画自动布局 http://weblog.invasivecode.com/post/42362079291/auto-layout-and-core-animation-auto-layout-was 一切都很顺利。 当我尝试在我的应用程序中使用这个概念,尝试从下到上设置设置屏幕(UIView)的动画时,当设置屏幕只是一个空的UIView时,效果非常好, 但如果我将UILabel

  • 问题内容: 我正在使用来更新旧的应用,并且当没有广告时,它会滑出屏幕。出现广告时,它会在屏幕上滑动。基本的东西。 旧样式,我将帧设置在动画块中。新样式,我对自动布局约束有一个确定Y位置,在这种情况下,它是距父视图底部的距离,并修改常量: 横幅完全按预期移动,但没有动画。 更新:我重新观看了WWDC 12讲的“掌握自动布局的最佳实践” ,其中涵盖了动画。它讨论了如何使用CoreAnimation更新

  • 虽然有几个问题的答案与我的相似,但似乎没有一个能解决我的困境。我有一个图像视图,我可以通过改变水平和垂直约束来移动它,并使用长按手势在屏幕上移动。如果这张图像没有移动一定的距离,我希望它能动画化回到原来的位置。我正在使用以下代码示例来尝试执行此操作: 和在其他地方定义为用户单击的位置 和定义为用户在超级视图中的位置 不用说,平移图像时,一切都正常。它会拖动,然后在手势结束时停止。问题是,如果用户没

  • 我在模拟一些效果,比如树叶飘落,雪和雨。我的第一个调用是使用CAEmitterLayer,它工作得很好,但我需要在上下文中渲染该层以保存为图像,这似乎是不可能的,或者至少是非常复杂的。 所以我正在处理一些视图动画。我需要不断地给我的ImageView设置动画,这样它就可以从屏幕上掉下来,然后以不同的速度重新出现在屏幕上。 所以我重新定位屏幕上的每一个图像视图,动画是动画,当动画完成时,我从完成块递