标签: core-animation

如何在iPhone上显示进度指示器叠加/ HUD?

我想在一个浮动在表视图上的半透明框中显示进度指示器.换句话说,当正在下载表格内容时,我希望在其上方显示"正在更新"标签.

我在商店的几个应用程序中看到了这一点,特别是Facebook(当你动摇重装时)和Darkslide.

我的第一个冲动是创建一个半透明的UIView,在其中放置一个UILabel和一个UIProgressIndicatorView,并将其添加到视图层次结构......但在哪里? UIView可能不会与其兄弟姐妹重叠,因此我无法将其作为窗口的子视图. 我也不能把它作为表的子视图,因为它会随表格内容向上和向下滚动.

我考虑过创建一个新的UIWindow,但文档基本上说没有.

我知道CALayers可以相互重叠,所以这是一个选项,但我不能在CALayer中放一个进度指示器,我可以吗?我应该滚动自己的进度指示器来动画CALayer而不是UIView吗?

我对听说私有API不感兴趣.

编辑:问题是基于一个错误的假设.NSViews(在Mac OS X上)可能不会重叠,但iPhone上的UIViews可能会重叠.

iphone cocoa-touch core-animation

23
推荐指数
3
解决办法
4万
查看次数

创建自定义的可动画属性

UIView你可以更改backgroundColour动画.在a上UISlideView你可以改变动画的值.

您可以将自定义属性添加到您自己的UIView子类,以便它可以动画?

如果我CGPath在我的内部,UIView那么我可以通过改变路径绘制的百分比来设置它的绘图.

我可以将该动画封装到子类中.

即我有UIView一个CGPath创建一个圆.

如果圆圈不存在则表示0%.如果圆圈已满,则表示100%.我可以通过改变路径绘制的百分比来绘制任何值.我还可以通过设置动画的百分比CGPath并重新绘制路径来为变化(在UIView子类中)设置动画.

我可以设置一些属性(即百分比),UIView以便我可以将更改粘贴到一个UIView animateWithDuration块中,它可以设置路径百分比变化的动画吗?

我希望我已经解释了我想做得好的事情.

基本上,我想做的就是...

[UIView animateWithDuration:1.0
 animations:^{
     myCircleView.percentage = 0.7;
 }
 completion:nil];
Run Code Online (Sandbox Code Playgroud)

并且圆形路径以给定百分比为动画.

iphone core-animation uiview ios

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

何时在Mac/iPhone上使用CALayer?

我有点困惑何时在iPhone或Mac上使用CALayer以及何时不使用它?CoreAnimation可以在我的基于UIView的对象上正常工作,而无需使用CALayer.何时适合挖掘这门课程?

iphone cocoa cocoa-touch core-animation objective-c

22
推荐指数
2
解决办法
6974
查看次数

什么时候在iOS中发生隐式动画?

每个人和每本书都声称CALayer中存在隐式动画.但是,每次我想验证到目前为止,我最终都会严格按照设定值进行验证.完全没有动画.

这是项目中没有其他任何事情发生的例子.我所做的就是创建一个视图,然后获取它的CALayer实例并执行一些应该隐式动画的操作.

[theLayer setValue:[NSNumber numberWithFloat:M_PI * 1.1] forKeyPath:@"transform.rotation.z"];
Run Code Online (Sandbox Code Playgroud)

另一个:

CGRect currentBounds = theLayer.bounds;
currentBounds.size.width += 120.f;
[self.animatedLayer setBounds:currentBounds];
Run Code Online (Sandbox Code Playgroud)

视图包含一些东西,所以我可以看到变化.我看到了视觉上的变化,但作为一个坚硬的瞬间.完全没有动画.

因此,在撰写关于核心动画和隐式动画的内容时,要么所有这些书都是错误的并且考虑到旧的Mac OS X知识,要么我做错了.任何人都可以提供一个演示iPhone上隐式动画的工作示例吗?

core-animation ios

22
推荐指数
1
解决办法
5176
查看次数

为什么给addArcWithCenter一个0度的startAngle使它从90度开始?

我正在创建一个CAShapeLayer用作UIView图层的掩码.我用a UIBezierPath来绘制形状图层.它工作得很好,除了我画画时得到一些奇怪的结果.几何体的行为不符合预期.我正试图在右上角绘制简单的"馅饼切片":

#define degreesToRadians(x) ((x) * M_PI / 180.0)

...

// "layer" refer's to the UIView's root layer

CAShapeLayer *maskLayer = [CAShapeLayer layer];

maskLayer.frame =
    layer.presentationLayer ? 
    ((CAGradientLayer *)layer.presentationLayer).bounds : layer.bounds;
maskLayer.fillRule = kCAFillRuleEvenOdd;
maskLayer.needsDisplayOnBoundsChange = YES;

CGFloat maskLayerWidth = maskLayer.bounds.size.width;
CGFloat maskLayerHeight = maskLayer.bounds.size.height;
CGPoint maskLayerCenter = 
    CGPointMake(maskLayerWidth/2,maskLayerHeight/2);

UIBezierPath *path = [UIBezierPath bezierPath];

[path moveToPoint:maskLayerCenter];

[path addArcWithCenter:maskLayerCenter radius:(maskLayerWidth/2)
startAngle:degreesToRadians(0) endAngle:degreesToRadians(90) clockwise:YES];

[path closePath];


maskLayer.path = path.CGPath;

layer.mask = maskLayer;
Run Code Online (Sandbox Code Playgroud)

最终结果是在右下角绘制了饼图切片.弧的第一个点是以90度绘制的,然后是180度.即使我使用0度和90度角,它为什么会这样做?

geometry core-animation objective-c ios uibezierpath

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

UIView动画取消任何触摸输入?

我在这里有一个UIScrollView我在屏幕中间添加了一个标签,当用户滚动到一个页面时,问题是当动画进行时用户无法滚动到下一页(所有用户)在动画结束之前,似乎已禁用交互.

这是我显示标签的代码.

if(!scrollView.dragging)
    [UIView animateWithDuration:0.3
                          delay:0.3
                        options:UIViewAnimationOptionCurveEaseOut
                     animations:^(void){
                         [vesselNameLabel setFrame:frame];
                     }
                     completion:^(BOOL finished){}];
Run Code Online (Sandbox Code Playgroud)

那么我如何在滚动视图中摆脱这种取消用户交互?

cocoa-touch core-animation uiview uianimation ios

21
推荐指数
1
解决办法
4150
查看次数

iOS,退出后台时重新启动动画

当我的应用程序退出后台时动画停止了.这是正常的.但我想从当前状态重新启动我的动画.如果没有我到处偷拍,我怎么做到这一点.

[UIView animateWithDuration:60 delay:0 options:(UIViewAnimationOptionCurveLinear |UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat | UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionBeginFromCurrentState) animations:^{
    [bg setFrame:CGRectMake(0, 0, 1378, 1005)];
} completion:nil];
Run Code Online (Sandbox Code Playgroud)

我尝试在动画前放置一个设置框架,但这只是让它快速捕捉.

[bg setFrame:CGRectMake(0, 0, 1378, 1005)];
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

iphone core-animation objective-c ipad ios

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

CoreAnimation - 不透明淡入淡出动画不起作用

我正在尝试创建一个相当简单的CoreAnimation用于AVComposition.我的目标是创建一个CALayer,通过各种子层,淡入淡出标题,然后淡出图像.幻灯片,基本上.这是使用导出到.mov AVAssetWriter.

在WWDC 2011 AVEditDemo的帮助下,我已经能够获得一个标题和图像.问题是它们同时都在屏幕上!

我创建了每个图层的不透明度为0.0.然后我添加了一个CABasicAnimation将它们从0.0淡化为1.0,使用以下代码:

CABasicAnimation *fadeInAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
fadeInAnimation.fromValue = [NSNumber numberWithFloat:0.0];
fadeInAnimation.toValue = [NSNumber numberWithFloat:1.0];
fadeInAnimation.additive = NO;
fadeInAnimation.removedOnCompletion = YES;
fadeInAnimation.beginTime = 1.0;
fadeInAnimation.duration = 1.0;
fadeInAnimation.fillMode = kCAFillModeForwards;
[titleLayer addAnimation:fadeInAnimation forKey:nil];
Run Code Online (Sandbox Code Playgroud)

问题似乎是'beginTime'属性."1.0"意味着延迟,因此它在动画开始后1秒开始.但是,它会立即出现在屏幕上.淡出动画

对于淡出,此代码的反向只是将fromValue更改为1.0,将toValue更改为0.0.它的开始时间为4.0,完美运行.

我正在使用以下内容来创建animatedTitleLayer:

CATextLayer *titleLayer = [CATextLayer layer];
titleLayer.string =self.album.title;
titleLayer.font = @"Helvetica";
titleLayer.fontSize = videoSize.height / 6;
titleLayer.alignmentMode = kCAAlignmentCenter;
titleLayer.bounds = CGRectMake(0, 0, videoSize.width, videoSize.height / 6);
titleLayer.foregroundColor = [[UIColor redColor]CGColor];
titleLayer.opacity …
Run Code Online (Sandbox Code Playgroud)

core-animation avfoundation calayer cakeyframeanimation ios

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

如何同步动画UIView和CALayer

为了说明这个问题,我在Github上编写了一个非常小的Xcode项目(两个类,11kb下载).看看这里的要点或使用git clone git@gist.github.com:93982af3b65d2151672e.git.


请考虑以下方案.我的自定义视图称为"容器视图",包含两个小方块.截图中显示:

两个正方形的初始位置的屏幕截图

蓝色方块是22x22 pt UIView实例,红色方块是22x22 pt CALayer实例.出于这个问题的目的,我希望两个正方形"粘住"到外部视图的右下角,同时我为该外部视图的框架设置动画.

我在UIView类的方法中更改容器视图的框架animateWithDuration:delay:options:animations:completion:,使用类型的非默认缓动参数UIViewAnimationCurveEaseOut.

[UIView animateWithDuration:1.0 delay:0 
                    options:UIViewAnimationCurveEaseOut 
                 animations:^{ _containerView.frame = randomFrame; } 
                 completion:nil];
Run Code Online (Sandbox Code Playgroud)

注意:蓝色UIView和红色CALayer的框架都在setFrame:容器视图的重写方法中设置,但如果我将蓝色UIView的autoresizingMask属性设置为UIView灵活的左边距和上边距,结果将是相同的.

在生成的动画中,蓝色方块按照我的预期方式"粘贴"到角落,但红色方块完全忽略了动画的时间和缓和.我认为这是因为Core Animation的隐式动画功能,这个功能在很多场合帮助了我.

以下是动画序列中的一些屏幕截图,用于说明两个方块的异步性:

动画中期的三个截图,其中红色方块不在

关于这个问题:有没有办法同步两个帧的变化,以便红色CALayer和蓝色UIView都以相同的动画持续时间和缓和曲线移动,相互粘连就好像它们是一个视图一样?

PS当然,两个方块粘在一起所需的视觉效果可以通过多种方式实现,例如,通过使两个层成为CALayers或UIViews,但真正问题所涉及的项目具有非常合理的原因.一个是CALayer,另一个是UIView.

cocoa-touch core-animation objective-c uiviewanimation

21
推荐指数
1
解决办法
8692
查看次数

如何应用CAGradientLayer作为另一个CALayer的掩码?

我有一个视图,它有一个CALayer.当我创建一个CAGradientLayer并将其应用为该视图的CALayer的掩码时,没有任何反应.为什么?

在-initWithFrame:视图中我这样做:

CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = self.bounds;
gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil];
//[self.layer insertSublayer:gradient atIndex:0];
self.layer.mask = gradient;
Run Code Online (Sandbox Code Playgroud)

如果我更换

self.layer.mask = gradient;
Run Code Online (Sandbox Code Playgroud)

[self.layer insertSublayer:gradient atIndex:0];
Run Code Online (Sandbox Code Playgroud)

然后我看到了渐变.它是从黑色到白色.

有什么诀窍?

core-animation calayer ios cagradientlayer

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