我试图从上到下制作视图幻灯片.这不是什么大问题,我用CABasicAnimation这个.问题是当我想删除视图时.我用这个动画.
CABasicAnimation *animation;
animation = [CABasicAnimation animationWithKeyPath:@"position"];
[animation setDelegate:self];
animation.toValue = [NSValue valueWithCGPoint:CGPointMake(self.view.layer.position.x, 0 - self.view.bounds.size.height / 2)];
animation.fromValue = [NSValue valueWithCGPoint:self.view.layer.position];
animation.autoreverses = NO;
animation.repeatCount = 0;
animation.duration = 0.25;
animation.timingFunction = [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut];
[self.view.layer addAnimation:animation forKey:@"moveX"];
Run Code Online (Sandbox Code Playgroud)
这完美地激发了视图的动画效果.但是,在动画结束后,我的视图再次出现.所以我添加了这一行:
[self.view removeFromSuperview];
Run Code Online (Sandbox Code Playgroud)
这会移除视图,但没有动画.所以我决定将删除代码添加到此委托:
-(void) animationDidStop:(CAAnimation *) animation finished:(bool) flag
Run Code Online (Sandbox Code Playgroud)
所以现在,动画工作,视图消失,但有时,我可以看到视图出现并消失得更快,就像在动画之后,视图出现,然后animationDidStop调用委托,视图消失,显然这很糟糕.我究竟做错了什么?
我有一个CABasicAnimation动画的属性,CALayer例如bounds.origin.我希望能够观察到随着时间的推移而变化的属性,但还没有找到一种100%有效的方法.
我试图在使用国际志愿者组织(键值观察)presentationLayer的bounds.origin的keyPath.系统抱怨在释放观察者之前释放了对象,这使我认为表示层只是临时的.观察presentationLayer.bounds.origin为密钥路径不起作用.
我尝试在另一个图层上创建一个属性并为其设置动画,例如通过声明@property并@dynamic在该图层上创建它.但是,只有在访问表示层时(例如,在动画结束时)才会更改此新属性,但在动画运行时它似乎不会更新.
我needsDisplayForKey在#2中使用了属性,它在动画期间触发更新,但对于这些问题:
CALayer具有非零帧时才有效.由于该层可能是CAShapeLayer或子类,因此它可能具有零帧.setNeedsDisplay了该层,但由于我实际上并没有绘制该层只监视属性更改,我不想让它重绘.我试过安排一个NSTimer,并在定时器回调样本中presentationLayer.这也适用于这些问题:
有什么建议?所有这些都将在iPhoneOS 3.0/3.1上.
CALayer -drawInContext:和-renderInContext之间有什么区别?
我有一个customTableView单元格 - 我想只更新单元格(基于发生的网络事件).
所以,当我第一次拨打网络电话时,我做了:
- (void)makeNetworkCall
{
[self.tableView beginUpdates];
// MAKE_NETWORK_CALL
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates]; // SIGABRT OCCURS HERE ON SECOND CALL
}
- (void)networkDataReturned:(NSDictionary*)dataReturned
{
// UPDATE_TABLE_VIEW_DATA_MODEL
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationNone];
}
Run Code Online (Sandbox Code Playgroud)
这在第一次调用网络事件时完美地工作,但是如果单元被轻击(因此再次调用网络事件,其结果现在已被缓存),我得到以下错误:
2011-06-22 11:19:11.262 App[3991:707] *** Assertion failure in -[_UITableViewUpdateSupport _setupAnimationsForExistingVisibleCells], /SourceCache/UIKit/UIKit-1448.89/UITableViewSupport.m:288
2011-06-22 11:19:11.327 App[3991:707] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Attempt to create two animations for cell'
*** Call stack at first throw:
(
0 CoreFoundation 0x32c7664f __exceptionPreprocess + 114
1 libobjc.A.dylib …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我使用drawViewHierarchyInRect:afterScreenUpdates:以获取我的视图的模糊图像(使用Apple的UIImage类别UIImageEffects).
我的代码看起来像这样:
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0);
[self.view drawViewHierarchyInRect:self.view.bounds afterScreenUpdates:YES];
UIImage *im = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
/* Use im */
Run Code Online (Sandbox Code Playgroud)
我在开发过程中注意到,在使用我的应用程序之后,我的许多动画都被延迟了,即,与应用程序的全新启动相比,我的视图在显着(但不到大约一秒)暂停之后开始动画.
经过一些调试后,我注意到仅使用drawViewHierarchyInRect:afterScreenUpdates:屏幕更新设置YES导致此延迟.如果在使用会话期间从未发送此消息,则永远不会出现延迟.使用NO的屏幕更新参数也做出了延迟消失.
奇怪的是,这个模糊的代码与延迟的动画完全无关(据我所知).有问题的动画不使用 drawViewHierarchyInRect:afterScreenUpdates:,它们是CAKeyframeAnimation动画.仅发送此消息(屏幕更新设置为YES)的行为似乎在我的应用程序中全局影响了动画.
这是怎么回事?
(我创建了说明效果的视频:有和没有动画延迟.请注意导航栏中"Check!"语音气泡的外观延迟.)
我已经创建了一个示例项目来说明这个潜在的错误.https://github.com/timarnold/AnimationBugExample
我收到Apple的回复,证实这是一个错误.见下面的答案.
我有一个UIImageView显示比更宽更高的图像UIImageView.我想使用动画在视图中平移图像(这样平底锅很漂亮和平滑).
在我看来,我应该能够仅仅调整bounds.origin的UIImageView,和图像应移动(因为形象应与作为视图中绘制它的起源,对不对?),但似乎并没有工作.的bounds.origin变化,但图像绘制在相同的位置.
几乎可以工作的是改变contentsRect视图的层.但这开始是一个单位正方形,即使图像的可视区域不是整个图像.所以我不确定如何检测到图像的远边被拉入可视区域(我需要避免,因为它通过将边缘拉伸到无限远来显示,看起来很好,低于标准杆).
我的视图目前已通过Interface Builder contentsGravity设置kCAGravityTopLeft,如果这有所不同(是否导致图像移动?).但是,没有其他选择似乎更好.
更新:要清楚,我想在视图内移动图像,同时保持视图在同一点.
文档并没有真正谈论这在技术上的作用.
fadeInAnimation.fillMode = kCAFillModeForwards;
Run Code Online (Sandbox Code Playgroud)
我真的没有看到这个的影响.我有一个alpha设置为0.0的视图.然后我淡入它.但是当我取消注释时,没有任何变化.相同的行为.我想了解这个fillMode真正做了什么.
我经常读到,在使用大量图像时,使用a CALayer而不是a UIImageView是性能提升.这是有道理的,因为UIImageView在内存中导致3个图像副本,这是Core Animation所需要的.但在我的情况下,我不使用核心动画.
如何将UIImage(或其图像数据)分配给a CALayer然后显示?
在我们的应用程序中,我们在CAEAGLLayer上面有UIScrollView.UIScrollView包含一些UIViews(红色矩形).在CAEAGLLayer中,我们绘制白色矩形.白色矩形的中心与红色矩形的中心相同.当UIScrollView滚动时,我们更新CAEAGLLayer中白色矩形的位置并渲染它们.
我们得到了预期的结果:白色矩形的中心总是与红色矩形的中心相同.
但是我们无法将CAEAGLLayer的更新与UIScrollView中的视图移动同步.我们有一些错误 - 红色矩形落后于白色矩形.
粗略地说,我们真的想让CAEAGLLayer与UIScollView一起延迟.
我们准备了示例代码.在设备上运行并滚动,您将看到白色矩形(由OpenGL绘制)比红色矩形(常规UIViews)移动得更快.在scrollViewDidScroll:委托调用中正在更新OpenGL.
https://www.dropbox.com/s/kzybsyu10825ikw/ios-opengl-scrollview-test.zip
它在iOS模拟器中的行为相同,只需看一下视频:http://www.youtube.com/watch?v = 1T9hsAVrEXw
红色= UIKit,白色= OpenGL
代码是:
- (void)scrollViewDidScroll:(UIScrollView *)aScrollView {
// reuses red squares that are gone outside thw bounds
[overlayView updateVisibleRect:CGRectMake(...)];
// draws white squares using OpenGL under the red squares
[openGlView updateVisibleRect:CGRectMake(...)];
}
Run Code Online (Sandbox Code Playgroud)
在简化的样本中可以很容易地证明同样的问题.工作的xcodeproj可以在以下位置找到:
https://www.dropbox.com/s/vznzccibhlf8bon/simple_sample.zip
示例项目基本上在OpenGL中绘制和动画一组WHITE方块,并为RED组的UIViews做同样的操作.红色和白色方块之间很容易看到滞后.
我正在设置以下UIView animateWithDuration:方法,目的是animationOn在程序中的其他位置设置我的BOOL以取消无限循环重复.我的印象completion是每次动画循环结束时都会调用该块,但事实并非如此.
是否completion在重复动画中调用了块?如果没有,是否有另一种方法可以在此方法之外停止此动画?
- (void) animateFirst: (UIButton *) button
{
button.transform = CGAffineTransformMakeScale(1.1, 1.1);
[UIView animateWithDuration: 0.4
delay: 0.0
options: UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat
animations: ^{
button.transform = CGAffineTransformIdentity;
} completion: ^(BOOL finished){
if (!animationOn) {
[UIView setAnimationRepeatCount: 0];
}
}];
}
Run Code Online (Sandbox Code Playgroud) core-animation objective-c uiviewanimation ios completion-block
core-animation ×10
iphone ×5
cocoa-touch ×4
ios ×4
objective-c ×3
calayer ×1
macos ×1
opengl-es ×1
performance ×1
uiimage ×1
uikit ×1
uitableview ×1