问题标签 [uiviewpropertyanimator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - 在视图控制器演示动画期间响应触摸事件
在我的 iOS 应用程序中,我的Toast
视图很像 Android 上的 toasts。当 Toast 出现时,它会在屏幕的一个小区域显示几秒钟,然后自动关闭。Toast 有两个主要属性:
- 当吐司出现在屏幕上时,用户可以像以前一样在应用程序中导航。
- Toast 是粘性的,这意味着无论如何它都会在屏幕上停留指定的持续时间(即使在推送、弹出、呈现和关闭其他视图控制器时)。
为了实现“粘性”,toast 以UIWindow
. 更具体地说,我调用present(toastViewController, animated: true, completion: nil)
了自定义窗口的根视图控制器,它使用我已经实现的自定义动画来呈现 toast,并与和UIViewPropertyAnimator
结合使用。由于窗口填满了整个屏幕,因此我重写了它的方法以始终返回 false。这会将触摸事件传播到包含 toast 下方的实际界面的键窗口。UIViewControllerTransitioningDelegate
UIViewControllerAnimatedTransitioning
point(inside point: CGPoint, with event: UIEvent?)
这在 toast 出现在屏幕上时效果很好,但是(这就是问题所在)当 toast在屏幕上和屏幕外动画时,键窗口中的 UI 被冻结。这意味着,如果用户在 toast 关闭时滚动表格视图,则 UI 将挂起大约 0.5 秒。
我已经验证了触摸事件确实可以在动画期间传播到键窗口,但是它们在到达实际的 UI 元素之前不知何故陷入了死胡同。我的猜测是这与占用主线程的动画有关,但无论哪种方式,我都希望听到有关如何解决此问题的建议。
swift - UIViewPropertyAnimator 的反弹效果
假设我有一个动画师将视图从 移动(0, 0)
到(-120, 0)
:
我将它与 一起使用UIPanGestureRecognizer
,这样我就可以随着手指的移动不断地调整视图的大小。
当我想在动画开始或结束时添加某种弹跳效果时,问题就来了。不仅仅是阻尼比,还有反弹效果。最简单的想象方法是滑动删除功能UITableViewCell
,您可以将“删除”按钮拖动到超出其实际宽度的位置,然后它会弹回。
实际上,我想要实现的是在段fractionComplete
之外设置属性的方法[0, 1]
,因此当分数为 时1.2
,偏移量变为144
而不是最大 120。
而现在 的最大值fractionComplete
正好是1
。
以下是一些可视化此问题的示例:
编辑(1 月 19 日):
抱歉我的延迟回复。以下是一些澄清:
我不使用UIView.animate(...)
,UIViewPropertyAnimator
而是使用一个非常具体的原因:它为我处理所有的时间、曲线和速度。
例如,您将视图拖到一半。这意味着剩余部分的持续时间应该是总持续时间的两倍。或者,如果您拖过 99% 的距离,它应该几乎立即完成剩余部分。
另外,UIViewPropertyAnimator
具有暂停(当用户再次开始拖动时)或反向(当用户开始向左拖动,但之后他改变主意并将手指向右移动时)等功能,我也从中受益.
所有这些都不适用于简单的 UIView 动画,或者充其量需要大量的努力。它只能进行简单的转换,但事实并非如此。
这就是为什么我必须使用某种动画师。
正如我在其发布者删除的答案中的评论线程中提到的那样,对我来说,这里最复杂的部分是模拟摩擦效果:拖得越远,视图实际移动的越少。就像您尝试将任何 UIScrollView 拖到其内容之外一样。
感谢您的努力,但我认为这两个答案中的任何一个都不相关。UIDynamicAnimator
只要我有时间,我就会尝试实现这种行为。可能在最近的一两周内。如果我有任何体面的结果,我会公布我的方法。
编辑(1 月 20 日):
我刚刚将一个演示项目上传到 GitHub,其中包括我在项目中拥有的所有转换。所以现在你实际上可以知道为什么我需要使用动画师以及我如何使用它们:https ://github.com/demon9733/bouncingview-prototype
您真正感兴趣的唯一文件是MainViewController+Modes.swift
. 与过渡和动画相关的所有内容都包含在其中。
我需要做的是使用户能够将手柄区域拖动到“隐藏”按钮宽度之外并具有阻尼效果。“隐藏”按钮将在向左滑动手柄区域时出现。
PS我并没有真正测试这个演示,所以它可能有我的主项目中没有的错误。所以你可以放心地忽略它们。
ios - UIViewPropertyAnimator 停止重复
我在 Factory 类中有此代码以返回 UIViewPropertyAnimators 以在何时何地使用:
该代码创建了一个UIViewPropertyAnimator
允许永久动画视图(一个不断旋转和旋转的视图)。它通过在完成块中再次调用自身来做到这一点。我现在遇到的问题是我无法使用UIViewPropertyAnimator.stopAnimation(true)
.
true
instopAnimation(_ withoutFinishing:)
值旨在确保动画返回到状态,而UIViewAnimatingState.inactive
无需使用 执行任何清理finishAnimation(at finalPosition:)
。
当我调用stopAnimation(true)
动画并没有停止。它是这样调用的:
上面的代码由用户点击动画视图触发并输出:
对我来说,这表明由于静态方法中的“递归”调用而导致spindleAnimator
引用不同。我可能弄错了。UIViewPropertyAnimator
AnimatorFactory.spinSpindle(spindle:)
本质上,我正在寻求帮助,以创建一个真正互动和重复的动画。到目前为止,我一直遇到令人难以置信的麻烦,但我不会抱怨,因为我学到了很多东西。stopAnimation(withoutFinishing:)
但是,我需要一些帮助,通过找到一个有效的电话将它们联系在一起。
谢谢!
编辑:
另一个有趣的事实是,如果在主轴完成第一次旋转之前(换句话说,在执行完成块之前)单击主轴,我可以停止动画。这让我相信“递归”调用会spinSpindle(spindle:)
创建另一个 UIViewPropertyAnimator,我无法为其调用stopAnimation(withoutFinishing:)
。虽然,我不认为我明白这是怎么回事......
spinSpindleAnimator.description
我通过每次调用时打印来测试这个理论spinSpindle(spindle:)
:
它给了
证实了我的怀疑。
ios - 返回App时重启UIViewPropertyAnimator
我刚刚构建了一个带有简单动画的 iOS 应用程序。但我在 UIViewPropertyAnimator 上苦苦挣扎。我想为一个按钮制作动画,这在我离开应用程序(按下主页按钮)并返回之前效果很好。动画已停止,不会重新开始。我试图在 ViewController didBecomeActive 之后停止动画并重新启动它,但这也不起作用。
我在 viewDidAppear 方法中启动动画如下:
这里是我停止并重新启动动画的代码:
我希望你们知道如何解决这个问题。提前致谢。
ios - 如何从更简单的 UISpringTimingParameter 初始化器派生 CASpringAnimation 属性?
我有一个弹簧动画曲线,使用UISpringTimingParameters
带有阻尼比和初始速度的 a 指定,我将它与 aUIViewPropertyAnimator
一起使用,并指定了它的持续时间。在我的应用程序的其他地方,我需要使用CASpringAnimation
. 但CASpringAnimation
不能仅使用阻尼比和 initialVelocity 进行初始化 - 它需要所有不同的弹簧参数并从中派生settlingDuration
。
给定持续时间、阻尼比和初始速度矢量,我如何创建一个CASpringAnimation
?
ios - UIViewPropertyAnimator:同时隐藏 TabBar 和 StatusBar (iOS 13)
试图同时隐藏 TabBar 和 StatusBar 并在同一个动画块内,我遇到了一个难以理解的布局行为。使用 tabbar item viewcontroller 开始以通常的方式隐藏 TabBar:
到目前为止,一切都很好:
现在让我们为 StatusBar 添加动画:
现在 StatusBar 正在滑动,bur TabBar 冻结(我不知道为什么):
任何使用 layoutIfNeeded()、setNeedsLayout() 等更新布局的尝试均不成功。现在让我们交换 TabBar 和 StatusBar 的动画:
现在两者都在滑动,但 TabBar 在动画开始时开始跳跃:
我发现在将 StatusBar 的指令添加到动画块时,会开始另外调用 ViewDidLayoutSubviews()。实际上,您可以在 ViewDidLayoutSubviews() 中修复 TabBar 的初始位置:
这种方法的缺点是 TabBar 在移动过程中会发生抽动,这取决于移动的速度和其他因素。
另一种方式(不使用 ViewDidLayoutSubviews())与逻辑相反,但在实践中有效。即,您可以将一个动画放在另一个动画的完成块中:
按照逻辑,我们有两个连续的动画。并且 TabBar 动画应该在 StatusBar 动画结束后开始。然而,在实践中:
这种方法的缺点是,如果你想反转动画(例如,用户在 TabBar 移动时点击了屏幕),变量animator1.isRunning将为 false,尽管 StatusBar 在物理上仍然会在屏幕上移动(我也不知道为什么)。
期待阅读您的评论、建议和解释。
ios - UIViewPropertyAnimator 不尊重持续时间和延迟参数
我的应用程序中有一个非常奇怪的问题。我用UIViewPropertyAnimator
动画来改变里面的图像UIImageView
。
听起来像是微不足道的任务,但出于某种原因,我的视图最终会立即改变图像,所以我最终得到的图像以光速闪烁,而不是给定的持续时间和延迟参数。
这是代码:
因此,根据代码动画应该需要 2 秒才能完成并在 6 秒延迟后开始,但它会立即开始并需要几毫秒才能完成,所以我最终得到了可怕的幻灯片。为什么会发生?
我也尝试使用UIViewPropertyAnimator(duration: 2, curve: .linear)
and 调用repeatingAnimator().startAnimation(afterDelay: 6)
,但结果是一样的。
ios - 我们是否总是需要在持久属性中保留动画?
目前我正在阅读 Matt Neuburg 的非常有趣的书。但我坚持这一刻:
在最简单的情况下,您只需启动动画并退后,正如我之前演示的:
在该代码中,UIViewPropertyAnimator 对象 anim 被实例化为局部变量,我们没有将其保留在持久属性中;但是动画有效,因为动画服务器保留了它。
当我们以上述方式使用动画时,我们是否需要在持久属性中保留动画?如果我们不将动画保留在持久属性中,为什么动画(在其他情况下似乎)不应该工作?我想我不明白还有谁读过这本书?
ios - UI/UX 与 UIViewPropertyAnimator 交互的自定义 UIView 动画
我需要在不使用任何 3rd 方库的情况下为我的一个流程制作自定义动画。
其中一个屏幕包含一个UICollectionView
,它将具有屏幕为collection view items
。
我已经使用 aUIStackview
来制作下面附加的自定义控件组件。因此,自定义控件包含一个UIStakckView
将包含一个UIView
名为DotView
.
我使用 a 的原因UIStackview
是它DotView
的 s 应该等于UICollectionView
.
现在,当我在集合视图中滑动并从一个页面转到另一个页面时,动画需要以交互方式进行更改。因此,就像用户使用食指滑动一样
我在下面附上了我需要的动画视频。
有人可以帮忙提供动画组件吗?谢谢你。