gpt4 book ai didi

objective-c - 如何像 CAMediaTimingFunction 的 functionWithControlPoints 一样自定义 UIViewAnimationCurve

转载 作者:可可西里 更新时间:2023-11-01 04:40:21 25 4
gpt4 key购买 nike

UIViewAnimationCurve只有

  • UIViewAnimationCurveEaseInOut
  • UIViewAnimationCurveEaseIn
  • UIViewAnimationCurveEaseOut
  • UIViewAnimationCurveLinear

这些函数。

但是,我需要像 ExpoOutBackInOut 这样的 UIView 动画。

像 ExpoOut 是 [CAMediaTimingFunction functionWithControlPoints:0.12 :0.51 :-0.4 :1];

我用过CABasicAnimation,但它不能像UIView动画那样改变frame,当改变view size时很糟糕。

或者,你有没有更好的方法来像真实的那样改变 View 框架,而不是看起来像放大。

谢谢。

最佳答案

这里的一个问题是无法为基于 UIView 的动画指定计时函数。据我所知,您将面临一系列令人不快的选择:

  • 改用基于 CALayer 的动画——严重的问题是,如果将委托(delegate)设置为 View ,则动画不会发生。由于这是 UIView 所必需的,因此这是一个没有吸引力的选项。
  • 将父层添加到您的 View ,并为该层设置动画——同样严重的问题是该层在 Nib 中无处可寻,对 Nib 的修改可能会无意中破坏动画。
  • 不要使用自定义计时函数。

我通过在动画之前将委托(delegate)设置为 nil 并在之后立即设置回 UIView 来破解我的方式,但感觉很脏。不过,我可能会遗漏一些东西。我的代码看起来像这样:

- (void)methodThatAnimates {
[CATransaction begin]; {
/* Must set to nil, otherwise the view just jumps to the new location. */
self.viewToAnimate.layer.delegate = nil;

CAMediaTimingFunction *timingFunction =
[CAMediaTimingFunction functionWithControlPoints:0.4 :0 :0 :1.0];
[CATransaction setAnimationTimingFunction:timingFunction]
self.viewToAnimate.layer.position = CGPoint(15.0, 0.0);

/* Set delegate back to the view, as is required per the
Apple documentation. */
self.viewToAnimate.layer.delegate = self.viewToAnimate;
} [CATransaction commit];
}

到目前为止,它似乎像一个魅力一样工作,但我一直期待一些奇怪的神器出现,因为暂时没有委托(delegate)。

关于objective-c - 如何像 CAMediaTimingFunction 的 functionWithControlPoints 一样自定义 UIViewAnimationCurve,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9905189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com