我有一个UIView,其中有一个UILabel作为子视图。
现在我用动画改变UIView的宽度(改变约束的常量属性)并在UIView动画中调用layoutIfNeed...(
视图正在正常调整大小,但UILabel(子视图)将字体大小更改为“结束”大小,但没有像uiview那样正确设置动画。
根据WWDC 2012会话,如果仅更改superview的常量,则子视图应设置动画。
UILabel的最小字体比例为0,1,小于字体必须调整大小。
我不认为你可以这样动画文本的大小。我能想到的唯一方法是创建标签的快照视图,将该视图添加到标签上,进行动画处理,然后删除快照视图。这段代码确实会稍微向下移动较小的文本,但它看起来很不错,当您取消隐藏标签并删除图像视图时,只需要非常小的移动。包含标签的小视图大小为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];
}
我正在努力通过更改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设置动画,这样它就可以从屏幕上掉下来,然后以不同的速度重新出现在屏幕上。 所以我重新定位屏幕上的每一个图像视图,动画是动画,当动画完成时,我从完成块递