标签: core-animation

动画后,查看位置重置

我试图从上到下制作视图幻灯片.这不是什么大问题,我用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调用委托,视图消失,显然这很糟糕.我究竟做错了什么?

iphone cocoa-touch core-animation

27
推荐指数
2
解决办法
1万
查看次数

观察CALayer中的动画属性更改

我有一个CABasicAnimation动画的属性,CALayer例如bounds.origin.我希望能够观察到随着时间的推移而变化的属性,但还没有找到一种100%有效的方法.

  1. 我试图在使用国际志愿者组织(键值观察)presentationLayerbounds.origin的keyPath.系统抱怨在释放观察者之前释放了对象,这使我认为表示层只是临时的.观察presentationLayer.bounds.origin为密钥路径不起作用.

  2. 我尝试在另一个图层上创建一个属性并为其设置动画,例如通过声明@property@dynamic在该图层上创建它.但是,只有在访问表示层时(例如,在动画结束时)才会更改此新属性,但在动画运行时它似乎不会更新.

  3. needsDisplayForKey在#2中使用了属性,它在动画期间触发更新,但对于这些问题:

    • 它仅在CALayer具有非零帧时才有效.由于该层可能是CAShapeLayer或子类,因此它可能具有零帧.
    • 看起来它触发setNeedsDisplay了该层,但由于我实际上并没有绘制该层只监视属性更改,我不想让它重绘.
  4. 我试过安排一个NSTimer,并在定时器回调样本中presentationLayer.这也适用于这些问题:

    • 计时器可能与动画更新略有不同步.
    • 由于偶尔会有原始动画被另一个动画抢占,因此在动画运行时以及仅在动画运行时才能实际触发定时器.

有什么建议?所有这些都将在iPhoneOS 3.0/3.1上.

iphone macos core-animation objective-c calayer

27
推荐指数
2
解决办法
4510
查看次数

27
推荐指数
1
解决办法
8677
查看次数

iOS UITableView"'尝试为单元格创建两个动画'"

我有一个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)

core-animation uitableview ios

27
推荐指数
2
解决办法
1万
查看次数

drawViewHierarchyInRect:afterScreenUpdates:延迟其他动画

在我的应用程序中,我使用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!"语音气泡的外观延迟.)

UPDATE

我已经创建了一个示例项目来说明这个潜在的错误.https://github.com/timarnold/AnimationBugExample

更新2号

我收到Apple的回复,证实这是一个错误.见下面的答案.

cocoa-touch core-animation objective-c ios

27
推荐指数
1
解决办法
2万
查看次数

如何在UIImageView中平移图像?

我有一个UIImageView显示比更宽更高的图像UIImageView.我想使用动画在视图中平移图像(这样平底锅很漂亮和平滑).

在我看来,我应该能够仅仅调整bounds.originUIImageView,和图像应移动(因为形象应与作为视图中绘制它的起源,对不对?),但似乎并没有工作.的bounds.origin变化,但图像绘制在相同的位置.

几乎可以工作的是改变contentsRect视图的层.但这开始是一个单位正方形,即使图像的可视区域不是整个图像.所以我不确定如何检测到图像的远边被拉入可视区域(我需要避免,因为它通过将边缘拉伸到无限远来显示,看起来很好,低于标准杆).

我的视图目前已通过Interface Builder contentsGravity设置kCAGravityTopLeft,如果这有所不同(是否导致图像移动?).但是,没有其他选择似乎更好.

更新:要清楚,我想在视图移动图像,同时保持视图在同一点.

cocoa-touch core-animation

26
推荐指数
2
解决办法
4万
查看次数

fillMode到底做了什么?

文档并没有真正谈论这在技术上的作用.

fadeInAnimation.fillMode = kCAFillModeForwards;
Run Code Online (Sandbox Code Playgroud)

我真的没有看到这个的影响.我有一个alpha设置为0.0的视图.然后我淡入它.但是当我取消注释时,没有任何变化.相同的行为.我想了解这个fillMode真正做了什么.

iphone cocoa-touch core-animation

26
推荐指数
2
解决办法
1万
查看次数

使用普通CALayer显示图像或UIImage

我经常读到,在使用大量图像时,使用a CALayer而不是a UIImageView是性能提升.这是有道理的,因为UIImageView在内存中导致3个图像副本,这是Core Animation所需要的.但在我的情况下,我不使用核心动画.

如何将UIImage(或其图像数据)分配给a CALayer然后显示?

iphone performance core-animation uiimage ios

25
推荐指数
2
解决办法
3万
查看次数

如何将OpenGL绘图与UIKit更新同步

在我们的应用程序中,我们在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做同样的操作.红色和白色方块之间很容易看到滞后.

core-animation opengl-es uikit

24
推荐指数
3
解决办法
3779
查看次数

使用BOOL /完成块停止自动反转/无限重复UIView动画

我正在设置以下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

24
推荐指数
2
解决办法
2万
查看次数