我想在一个浮动在表视图上的半透明框中显示进度指示器.换句话说,当正在下载表格内容时,我希望在其上方显示"正在更新"标签.
我在商店的几个应用程序中看到了这一点,特别是Facebook(当你动摇重装时)和Darkslide.
我的第一个冲动是创建一个半透明的UIView,在其中放置一个UILabel和一个UIProgressIndicatorView,并将其添加到视图层次结构......但在哪里? UIView可能不会与其兄弟姐妹重叠,因此我无法将其作为窗口的子视图. 我也不能把它作为表的子视图,因为它会随表格内容向上和向下滚动.
我考虑过创建一个新的UIWindow,但文档基本上说没有.
我知道CALayers可以相互重叠,所以这是一个选项,但我不能在CALayer中放一个进度指示器,我可以吗?我应该滚动自己的进度指示器来动画CALayer而不是UIView吗?
我对听说私有API不感兴趣.
编辑:问题是基于一个错误的假设.NSViews(在Mac OS X上)可能不会重叠,但iPhone上的UIViews可能会重叠.
在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或Mac上使用CALayer以及何时不使用它?CoreAnimation可以在我的基于UIView的对象上正常工作,而无需使用CALayer.何时适合挖掘这门课程?
每个人和每本书都声称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上隐式动画的工作示例吗?
我正在创建一个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度角,它为什么会这样做?
我在这里有一个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)
那么我如何在滚动视图中摆脱这种取消用户交互?
当我的应用程序退出后台时动画停止了.这是正常的.但我想从当前状态重新启动我的动画.如果没有我到处偷拍,我怎么做到这一点.
[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)
有任何想法吗?
我正在尝试创建一个相当简单的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) 为了说明这个问题,我在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.
我有一个视图,它有一个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 ×10
ios ×7
cocoa-touch ×4
iphone ×4
objective-c ×4
calayer ×2
uiview ×2
avfoundation ×1
cocoa ×1
geometry ×1
ipad ×1
uianimation ×1
uibezierpath ×1