我们想在我们的 iPhone 应用程序中使用 UITabBar,但有一个异常(exception):我们有一个“同步”按钮,我想在同步操作发生时旋转它。
不幸的是,这意味着必须创建一个自定义标签栏,但这既不是这里也不是那里:我使用 Core Animation 实现的动画看起来很棒。问题是,在设置动画时,它会对屏幕上使用动画的其他所有内容的性能产生不利影响:UITableView 滚动、MKMapView 平移和引脚掉落等。我的测试设备是 iPhone 4。
问题似乎是我如何实现标签栏 - 我想实现与 UITabBar 非常相似的东西,你只需为图标提供 PNG,它使用 alpha channel 创建正常和突出显示状态掩盖背景图像。我用 CALayer 的 mask 属性完成了这个:
// Inside a UIView subclass' init method...
// Create the mask layer by settings its contents as our PNG icon.
CALayer *maskLayer = [CALayer layer];
maskLayer.frame = CGRectMake(0, 0, 31, 31);
maskLayer.contentsGravity = kCAGravityCenter;
maskLayer.contentsScale = [[UIScreen mainScreen] scale];
maskLayer.rasterizationScale = [[UIScreen mainScreen] scale];
maskLayer.contents = (id)symbolImage.CGImage;
maskLayer.shouldRasterize = YES;
maskLayer.opaque = YES;
fgLayer = [[CALayer layer] retain];
fgLayer.frame = self.layer.frame;
fgLayer.backgroundColor = [UIColor colorWithImageNamed:@"tabbar-normal-bg.png"].CGColor;
fgLayer.mask = maskLayer; // Apply the mask
fgLayer.shouldRasterize = YES;
fgLayer.opaque = YES;
[self.layer addSublayer:fgLayer];
(注意:在上面的屏幕截图中,您可以看到我还添加了一个阴影层,但为了简单起见,我从代码中删除了它。我在同步图标设置动画时从同步图标中删除了阴影层,所以它不应该不相关。)
要制作动画,我只需旋转 mask 层:
- (void)startAnimating {
CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath: @"transform"];
CATransform3D transform = CATransform3DMakeRotation(RADIANS(179.9), 0.0, 0.0, 1.0);
animation.toValue = [NSValue valueWithCATransform3D:transform];
animation.duration = 5;
animation.repeatCount = 10000;
animation.removedOnCompletion = YES;
[fgLayer.mask addAnimation:animation forKey:@"rotate"]; // Add animation to the mask
}
所以这一切都很好,除了性能。你可以看到我已经尝试过在 Google 上出现的关于栅格化图层/使它们不透明的提示 - 没有帮助。
我想我已经确定 mask 层是罪魁祸首。当我取出 mask 层并旋转 fgLayer 而不是它的 mask 时,性能非常好,尽管这肯定不是我想要的效果:
如果在应用 mask 时旋转 fgLayer 而不是 mask ,性能也和以前一样差。
因此,如果必须重新合成 mask ,动画的每一帧都会变慢,我是否可以使用任何其他技术来实现类似的效果,从而获得更好的性能?使用路径而不是图像作为 mask 层?或者我是否必须降低到 OpenGL 或其他东西以获得良好的性能?
更新:进一步强化了掩码是减速的想法,我的同事建议尝试旋转一个 CALayer,仅将图像作为内容——与我上面没有掩码的示例非常相似——这样的表现也很好。所以我真的只能做那样的纯色(没有渐变),但这可能是一个很好的临时解决方案。不过,我仍然希望以良好的性能实现旋转蒙版,因此欢迎提出建议:)
最佳答案
布伦特,
为什么需要使用图层蒙版?不能将 mask 层转换为子层吗?您只需要确保您的图像具有正确的 alpha 并且您将使用它的 CGImageRef 作为该层的内容。
还有一点。我还没有弄清楚为什么,但是当我在每一层而不是顶层应用 shouldRasterize 时,我也注意到了性能问题。您可能会看到在 mask 层中删除对 setShouldRasterize:YES 的引用是否有帮助。
关于iphone - Core Animation CALayer mask 动画表现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4520941/
Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u
动画/*INITIALIZEANANIMATION 初始化一个动画*-----------------------*/lv_anim_ta;lv_anim_init(&a);/*MANDATORYSETTINGS 必选设置*------------------*//*Setthe"animator"function 设置“动画”功能*/lv_anim_set_exec_cb(&a,(lv_anim_exec_xcb_t)lv_obj_set_x);/*Setthe"animator"function*/lv_anim_set_var(&a,obj);/*Lengthoftheanim
我使用以下钩子(Hook)来检查在执行includeFoo时执行包含的模块:moduleFoodefself.included(includer)putsincluderendendModule#include在模块中(通常使用它的地方)与在顶层的行为不同。在模块内部,self是模块,它是Module的一个实例.当我调用include,执行包含的模块是whatself是:moduleBarputsself#=>BarincludeFoo#=>includer:Barend在ruby脚本的顶层,self是main,它是Object的一个实例.当我调用include在顶层,包含的模块是
有人知道如何使用Carrierwave+MiniMagick将动画GIF压缩到第一帧吗? 最佳答案 我认为MiniMagick有一些变化,因为我只花了三个小时试图找出为什么Andrey的代码对我不起作用。我收到以下错误:ActiveRecord::RecordInvalid(Validationfailed:ImageFailedtomanipulatewithMiniMagick,maybeitisnotanimage?OriginalError:Command("mogrify-scene/var/folders/0o/0oqN
我不明白为什么在Ruby中,Array#slice和Array#slice!的行为与Array#sort和Array#sort!(一个返回新数组的结果,另一个处理当前对象)。使用sort第一个(没有爆炸),返回当前数组的排序副本,并且sort!对当前数组进行排序。slice,返回指定范围的数组,slice!从当前对象删除指定范围。Array#slice!的行为为何如此,而不是使当前对象成为具有指定范围的数组?例子:a=[0,1,2,3,4,5,6,7,8,9]b=a.slice(2,2)puts"slice:"puts"a="+a.inspectputs"b="+b.inspectb=
我正在构建一个与RubyonRails后端对话的iPhone应用程序。RubyonRails应用程序还将为Web用户提供服务。restful_authentication插件是提供快速和可定制的用户身份验证的绝佳方式。但是,我希望iPhone应用程序的用户在新列中存储一个由手机的唯一标识符([[UIDevicedevice]uniqueIdentifier])自动创建的帐户。稍后,当用户准备好创建用户名/密码时,帐户将更新为包含用户名和密码,iPhone唯一标识符保持不变。用户在设置用户名/密码之前不能访问该网站。然而,他们可以使用iPhone应用程序,因为该应用程序可以使用它的标识符
这是一个理论问题:是否可以将FalseClass的行为更改为像TrueClass一样?可以覆盖to_s、xor、&、|行为,但这还不够。如果你喜欢测试驱动开发,请听从我同事的建议:puts"falseisnewtrue!"iffalseputs"neverhappens"iftrueassertfalse断言行不通,对吗?有没有可能顺利通过考试? 最佳答案 这是不可能的。一种思考方式是没有可以重新定义的方法Object#truthiness?。在RubyMRI中,真实性测试是RTEST宏是硬连接的,除了Qfalse和Qnil外,这两
我有一个使用deviseonrails3的应用程序。我想启用http身份验证,以便我可以从iPhone应用程序向我的网络应用程序进行身份验证。如何从我的iPhone应用程序进行身份验证以进行设计?这安全吗?还是我应该进行不同的身份验证? 最佳答案 从设计的角度来看,您有3个选择:1)使用基本的http身份验证:您的iPhone应用程序有一个secretkey-这是在您的iPhone应用程序代码中烘焙的-用于对网络应用程序的每个请求进行身份验证。Google搜索:“设计基本的http身份验证”2)您可以通过在您的iPhone应用程序中
我正在尝试为每个ajax请求显示一个加载指示器,我在Rails3应用程序中工作。HTML:"loading-indicator",:style=>"display:none")%>CSS:#loading-indicator{position:absolute;left:10px;top:10px;}loading.js:我放在assest/javascripts/$(document).ready(function(){$(document).ajaxSend(function(event,request,settings){$('#loading-indicator').show(
这个问题在这里已经有了答案:关闭13年前。PossibleDuplicates:HowcanIdevelopforiPhoneusingaWindowsdevelopmentmachine?我想为我妻子的手机构建一个iPhone应用程序,但我对购买Mac作为一次性工作的开发平台不感兴趣。应用程序:应该在iPhone上独立运行(即没有网络连接)完全可以接受使用iPhoneJavascript库之一创建的GUI会做一些数据库IO来读取和更新数据没有商业值(value),永远不会被任何人使用这是我的想法:越狱iPhone在iPhone上安装Ruby+Sinatra使用Sinatra编写应用程