gpt4 book ai didi

ios - 运行自定义动画的首选方式

转载 作者:行者123 更新时间:2023-11-29 02:32:24 24 4
gpt4 key购买 nike

我需要在 iOS 应用程序中运行复杂的自定义动画。为此,我写了一个需要重复调​​用的函数,它使用当前时间戳来计算屏幕上 UIView 元素的位置、颜色、阴影等。

似乎有一大堆不同的方法可以用来调用这个函数:

我尝试先从一个单独的线程调用我的动画函数,但是当线程运行时,我看不到任何屏幕更新,直到我通过设备旋转手动触发刷新,所以我一定是错过了一些步骤我从 GUI 线程内部而不是我自己调用更新函数或使 View 无效或其他东西...但我什至不知道这是否是最好的方法...

在不阻塞 GUI 的情况下尽可能快地(或以 10 毫秒左右的小延迟)继续调用函数(例如,对于动画)的首选方法是什么,如果此函数,例如,更改 View 的背景颜色或位置,屏幕会更新吗?

如果可能的话,我想使用一种尽可能向后兼容的方法,所以最好是不使用 iOS 8.1 中引入的任何功能的方法(夸张)...:)

旁白:

很抱歉没有发布代码示例。我正在使用 RoboVM,不想“吓跑”真正的 XCode 开发人员的任何答案。此外,这更像是一个一般性的概念性问题,而不是特定的错误修复。

最佳答案

我从 CADisplayLink 中找到了最佳性能。

displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkTick)];
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];

- (void)displayLinkTick {
// Update your animation.
}

当您销毁此 View 时,不要忘记拆卸,否则您将调用 displayLinkTick 直到应用程序退出:

[displayLink removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];

或者,如果您使用(或转换为)CALayer,您的子类将从动画键上的 needsDisplayForKey: 返回 YES .然后,在 CALayer 子类的 display 方法中,您将应用 self.presentationLayer 对动画所做的更改。

@property (assign) CGFloat myAnimatingProperty;

@implementation MyAnimatingLayer : CALayer
+ (BOOL)needsDisplayForKey:(NSString *)key {
if ([key isEqualToString:@"myAnimatingProperty"]) {
return YES;
}
return [super needsDisplayForKey:key];
}

- (void)display {
if ([self.animationKeys containsObject:@"myAnimatingProperty"]) {
CGFloat currentValue = self.presentationLayer.myAnimatingProperty;
// Update.
}
}
@end

第二种方式将允许您非常轻松地链接到内置的缓动函数。

关于ios - 运行自定义动画的首选方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26719836/

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