- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
因此,我们遇到了一些有趣的问题,这些问题似乎与表示层的缓存有关,我们想知道其他人是否看到了这一点,以及我们可以采取哪些解决方法。
我们有几个我们自己的属性,我们正在隐式设置动画。我们通过将它们声明为属性并动态合成它们来做到这一点:
@interface GOOLayer : CALayer
@property float gooValue;
@end
NSString *const kGOOLayerValueKey = @"gooValue";
@implementation GOOLayer
@dynamic gooValue;
- (id)initWithLayer:(id)layer {
if ((self = [super initWithLayer:layer])) {
id value = [layer valueForKey:kGOOLayerValueKey];
[self setValue:value forKey:kGOOLayerValueKey];
}
return self;
}
- (id<CAAction>)actionForKey:(NSString *)event {
id <CAAction> action = [super actionForKey:event];
if (action == nil && [event isEqual:kGOOLayerValueKey]) {
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:event];
animation.fromValue = [self.presentationLayer valueForKey:event];
animation.duration = [CATransaction animationDuration];
return animation;
}
return action;
}
- (void)display {
GOOLayer *presoLayer = [self presentationLayer];
NSLog(@"Display GooValue: %f", presoLayer.gooValue);
}
+ (BOOL)needsDisplayForKey:(NSString *)key {
if ([key isEqual:kGOOLayerValueKey]) {
return YES;
}
return [super needsDisplayForKey:key];
}
在大多数情况下,这工作正常,我们看到记录了适当的值。在第一种情况下,我们得到了适当的隐式动画:
- (IBAction)doSomeGoo:(id)sender {
sublayer_.gooValue = random();
}
输出:
2012-12-19 10:10:41.440 CoreAnimation[94149:c07] Display GooValue: 1804289408.000000
2012-12-19 10:10:41.502 CoreAnimation[94149:c07] Display GooValue: 1804289408.000000
...
2012-12-19 10:10:41.739 CoreAnimation[94149:c07] Display GooValue: 898766464.000000
2012-12-19 10:10:41.757 CoreAnimation[94149:c07] Display GooValue: 846930880.000000
在第二种情况下,我们禁用了这些操作,所以我们得到了一个很好的值更新:
- (IBAction)doSomeGoo2:(id)sender {
long newValue = random();
NSLog(@"newValue = %f", (float)newValue);
[CATransaction begin];
[CATransaction setDisableActions:YES];
sublayer_.gooValue = newValue;
[CATransaction commit];
}
第一次通过:
2012-12-19 10:11:16.208 CoreAnimation[94149:c07] newValue = 1714636928.000000
2012-12-19 10:11:16.209 CoreAnimation[94149:c07] Display GooValue: 1714636928.000000
第二次通过:
2012-12-19 10:11:26.258 CoreAnimation[94149:c07] newValue = 1957747840.000000
2012-12-19 10:11:26.259 CoreAnimation[94149:c07] Display GooValue: 1957747840.000000
这是我们在进行有趣的事务之前调用 [CALayer presentationLayer] 的第三种情况:
- (IBAction)doSomeGoo3:(id)sender {
GOOLayer *presoLayer = sublayer_.presentationLayer;
long newValue = random();
NSLog(@"presoLayer.gooValue = %f newValue = %f", presoLayer.gooValue, (float)newValue);
[CATransaction begin];
[CATransaction setDisableActions:YES];
sublayer_.gooValue = newValue;
[CATransaction commit];
}
第一次通过:
2012-12-19 10:12:12.505 CoreAnimation[94149:c07] presoLayer.gooValue = 1957747840.000000 newValue = 424238336.000000
2012-12-19 10:12:12.505 CoreAnimation[94149:c07] Display GooValue: 1957747840.000000
第二次通过:
2012-12-19 10:12:13.905 CoreAnimation[94149:c07] presoLayer.gooValue = 424238336.000000 newValue = 719885376.000000
2012-12-19 10:12:13.906 CoreAnimation[94149:c07] Display GooValue: 424238336.000000
请注意添加 presentationLayer 调用是如何使显示无法获取当前值的。
关于如何处理这个问题的任何建议,或者如果我完全误解了事情,这是预期的行为?
最佳答案
我没有访问presentationLayer
,但今天仍然遇到同样的问题。
每当 UIScrollView
的滚动条出现时,一些动画就不会按预期运行。我花了几个小时才弄清楚这是一个与 CATransaction
和访问 presentationLayer
相关的问题。
访问 presentationLayer
会导致 CATransaction
忽略(或推迟)显式事务的任何提交,直到当前运行循环周期结束。查看消息日志,只要访问任何层的 presentationLayer
,显式事务的 +[CATransaction commit]
就会变成空操作。
我找到了两种使这些提交再次起作用的方法,但会产生负面影响。
+[CATransaction flush]
刷新所有层更改更新所有层的 presentationLayer
并使 +[CATransaction begin…commit]
工作正如预期的那样。+[CATransaction commit]
提交隐式事务会产生相同的结果。但我一这样做,整个应用程序就出现了其他随机问题。有些 View 即使布局正确甚至调用了 drawRect:
也是不可见的。更深入一点,我注意到 UIView
和它们的支持 CALayer
经常变得不同步。
我得出结论,依赖 presentationLayer
来完成我想做的事情是错误的。
Apple 的文档文章 Core Animation Rendering Architecture清楚地表明 presentationLayer
具有层的所有值,因为它们当前对用户可见。在 runloop 循环结束(或外部通常隐式的 CATransaction
被刷新/提交)和所有层更改之前,presentationLayer
不会反射(reflect)任何有或没有动画的更改呈现给用户。
由于我的动画依赖于同一 runloop 周期内对层所做的更改,因此这些更改对用户尚不可见,因此无法通过 presentationLayer
获得。
-[CALayer display]
应该只访问层的值,而不是它的 presentationLayer
的值,如 Providing Layer Content 中的示例节目。应该从用户当前看到的内容开始的动画可以使用 presentationLayer
的值作为 fromValue
。
仍然出现的任何其他问题很可能是由于以错误的方式使用渲染架构。我将重新考虑我的动画,以便它们使用图层的当前状态而不是 presentationLayer
的状态。
关于ios - 为什么 CoreAnimation 似乎在缓存表示层副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14251095/
谁能帮我解决这个问题?我有一个 Tomcat 和简单的 JSF 应用程序:https://github.com/gooamoko/jsfbilling/ .当我在 Tomcat 上运行应用程序时,它运
我有两个这样的域类,第一个是 Manager : package com.mnm class Manager { String name; static hasMany = [ pro
当我运行以下代码时,打印输出似乎不正确。 void thread_Calc(int *pos) { printf("recieved %d\n", *pos); sig = -1; man
这个问题在这里已经有了答案: How to access a local variable from a different function using pointers? (10 个答案) 关闭
我编写了一个程序,其中列表构建器方法返回 IEnumerable of string,其中包括大量字符串(100 万个项目),我将其存储在 List of string 中,然后它将所有项目附加到 中
我正在尝试编写一个 IRC 类型的聊天客户端,它具有可以连接到服务器的客户端。我试图让它在本地 atm 上工作(使用 FIFOS 而不是套接字)。 我遇到了以下我似乎无法解决的问题: 接受新的客户端连
我的一个 cronjobs 每天发送一封电子邮件 35 6 * * * cd $EZPUBLISHROOT && $PHP runcronjobs.php -q 2>&1 我停止使用 cron sud
我使用 WPF 打印路径来处理在我们的应用程序中创建的大型图表。整个图表由视觉效果组成。 所谓的“DesignerPaginator”对图表进行分页(非常简单)。 从这一点来说,我做了以下三件事: -
我尝试在更新之前跟踪系统应用程序并使用: public static boolean isSystemApplication(Context ctx, IContent content) {
我在这里附上了一个查询分析结果,https://explain.depesz.com/s/x9BN 这是查询 EXPLAIN ANALYZE SELECT branche
我正在做一个 CXF(spring) 项目 (HUB)。部署后,我可以看到肥皂和休息服务列表,我通过两个地址打开它。一种是使用本地主机,第二种是使用我电脑的 ip。所以我得到了这些输出。 使用本地主机
这是一个 AnyHashable 不支持枚举转换的简单案例。 enum testEnum: String { case Test } let myObject: AnyHashable = t
我的主要目标是比较存储在数据库和 XLSX 文件中的数据。 为此,我按以下方式创建了两个列表: private class ProductList { public string produc
我从 CMake 3.6 更新到任何最新版本 (3.12.0-rc2),现在我的一个程序无法编译。 奇怪的是,错误消息显示了标准库本身中的 undefined symbol 。这是错误消息: Unde
我希望将我的自定义对话框动画化为从特定点出现,但我无法为对话框设置动画。 该对话框是一个基本的 RelativeLayout,设置为 extends Dialog 类中的布局。 正如这里的一些答案所建
我已经在这个论坛上调查过很多类似的问题,但似乎没有一个能解决我的问题。 我会在底部列出我在这个论坛上看到的一些问题页面,但让我先谈谈我对这个问题的看法。 我正在使用 codeigniter v 2.x
我正在尝试在 RHEL 7 上启动一个 docker-compose 项目作为 systemd 服务。这是我的 systemd 脚本 (/etc/systemd/system/wp.service):
这个问题已经有答案了: "Notice: Undefined variable", "Notice: Undefined index", "Warning: Undefined array key",
我正在尝试在 RHEL 7 上启动一个 docker-compose 项目作为 systemd 服务。这是我的 systemd 脚本 (/etc/systemd/system/wp.service):
此问题出现在my last question here之后。我想将每个按钮聚焦和失去焦点背景设置为主菜单(ContentPane 即 JPanel)下方的背景颜色,因此按钮看起来像选项卡。它在不同的环
我是一名优秀的程序员,十分优秀!