当前位置: 首页 > 编程笔记 >

iOS 如何为自动版面设置动画

李文轩
2023-03-14
本文向大家介绍iOS 如何为自动版面设置动画,包括了iOS 如何为自动版面设置动画的使用技巧和注意事项,需要的朋友参考一下

示例

如果没有“自动布局”,动画将随着时间的推移更改视图的帧而完成。使用“自动布局”时,约束决定了视图框架,因此您必须为约束设置动画。这种间接方式使动画更难以可视化。

以下是使用“自动版式”制作动画的方法

  1. 改变约束的不断使用周期调用创建后(CADisplayLink,dispatch_source_t,dispatch_after,NSTimer)。然后调用layoutIfNeeded以更新约束。例:

目标C:

self.someConstraint.constant = 10.0;
[UIView animateWithDuration:0.25 animations:^{
    [self.view layoutIfNeeded];
}];

迅速:

self.someConstraint.constant = 10.0
UIView.animate(withDuration: 0.25, animations: self.view.layoutIfNeeded)

  1. 更改约束并[view layoutIfNeeded]在动画块内调用。这会在两个位置之间插值,而忽略了动画期间的约束。

[UIView animateWithDuration:0.5 animations:^{
    [view layoutIfNeeded];
}]

  1. 更改约束的优先级。与添加和删除约束相比,这占用的CPU更少。

  2. 删除所有约束并使用自动调整掩码。对于以后,您必须设置view.translatesAutoresizingMaskIntoConstraints = YES。

  3. 使用不会干扰预期动画的约束

  4. 使用容器视图。使用约束定位超级视图。然后添加一个子视图,该子视图的约束不会与动画发生冲突,例如:相对于父视图的中心。这会将部分约束卸载到父视图,因此它们不会与子视图中的动画作斗争。

  5. 设置图层动画代替视图。图层变换不会触发自动布局。

CABasicAnimation* ba = [CABasicAnimation animationWithKeyPath:@"transform"];
ba.autoreverses = YES;
ba.duration = 0.3;
ba.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(1.1, 1.1, 1)];
[v.layer addAnimation:ba forKey:nil];

  1. 覆盖layoutSubviews。调用[super layoutSubviews]并微调约束。

  2. 更改viewDidLayoutSubviews中的框架。自动版式已应用到中layoutSubviews,因此一旦完成,请在中进行更改viewDidLayoutSubviews。

  3. 退出自动版式并手动设置视图。您可以执行此覆盖layoutSubviews/layout而不调用超类的实现。

快速提示:如果未插入动画视图的父级(即动画从开始状态跳转到结束状态),请调用layoutIfNeeded()最深的视图,该视图是已动画视图的父级(换句话说,即不受动画影响)。我不知道为什么会这样。

 类似资料:
  • 我不使用GUI编辑器手动创建布局,我需要将高度设置为“自动”,以便用户可以看到整个表单。我将GridLayout包装到FlowLayout中,这样输入就不会被拉伸。创建这样的布局的最佳实践是什么。是否有人可以修改它,使整个表单可见或使用GridLayout,但可以设置表单中输入的宽度和高度? 未使用包装方法设置首选尺寸 使用包装方法设置首选尺寸 将扩展状态设置为最大化,但更新按钮不完全可见。如何设

  • 由于某种原因,maven在构建我的项目时自动选择java编译器1.5,尽管我安装了JDK1.8 步骤1 ,然后选择“工作区默认JRE(JDK1.8.0_102)”。 我在那个窗口中注意到的是:只有J2SE-1.x,其中x<=5 步骤3 然后转到`Project->Java Compiler,在这里我发现编译器遵从性级别设置为1.5(参见屏幕截图)。因此我将“编译器遵从级别更改为1.8”

  • 问题内容: 我想制作一个UIImageView动画。我声明了NSLayoutConstraintin viewDidLoad并使用了以下代码: 为什么我的图像不动? 问题答案: 在您按下时viewDidLoad,约束引擎尚未 应用,并且视图的起始位置尚未建立。 因此,可以随时在中添加原始约束viewDidLoad,但是您 需要将推迟到animateWithDuration该过程的后面(例如 vie

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

  • 关于UITableViewCell高度动画,在堆栈溢出方面有很多类似的问题,但对于新的iOS8自动布局驱动的表视图,这些问题都不起作用。我的问题: 自定义单元格: 注意旋转木马高度限制。这是内容视图的子视图(唯一的子视图)的高度约束。 然后,在“查看我要展开的所有操作”单元上,我的代码: 如您所见,我尝试使用这个很好的旧解决方案: 您可以在选中UITableViewCell时设置高度更改的动画吗?