我正在尝试在iOS应用中拖动CALayer.
一旦我改变它的位置属性,它就会尝试动画到新位置,并在整个地方闪烁:
layer.position = CGPointMake(x, y)
Run Code Online (Sandbox Code Playgroud)
如何立即移动CALayers?我似乎无法理解Core Animation API.
这让我疯狂!我正在制作绘图应用程序.假设我正在制作一张UIView名片.
我在这个视图([sheet.layer addSublayer:...])中添加了一些子图层然后我想要绘制它们.为此,我正在创建一个CGImageRef并将其放入图层中contents.但它是动画的,我不希望这样.
我尝试了一切:
removeAnimationForKey:removeAllAnimationsdelegate[CATransaction setDisableAnimations:YES]这似乎是正确的.我不明白为什么这个图层仍然是动画的; _;
难道我做错了什么?有秘密的方式吗?
当我设置实例的backgroundColor属性时CALayer,更改似乎有点动画.但在我的情况下,我不希望这样.如何设置backgroundColor无动画?
我有一个子类UICollectionViewLayout,将单元格放在一个圆圈中.布局返回YES呼叫shouldInvalidateLayoutForBoundsChange:.旋转时,初始位置的单元格淡出,最终位置的单元格淡入.
通过在我的布局中添加以下代码,我可以禁用淡入淡出,并且项目的圆圈似乎只是随着方向更改而旋转:
- (UICollectionViewLayoutAttributes *)initialLayoutAttributesForAppearingItemAtIndexPath:(NSIndexPath *)itemIndexPath {
return nil;
}
- (UICollectionViewLayoutAttributes *)finalLayoutAttributesForDisappearingItemAtIndexPath:(NSIndexPath *)itemIndexPath {
return [self layoutAttributesForItemAtIndexPath:itemIndexPath];
}
Run Code Online (Sandbox Code Playgroud)
为什么这些方法会在边界变化时调用,因为文档似乎没有暗示它们会这样做?文档似乎表明它们被称为与从集合视图中插入和删除项目相关.
是否有更好的方法可以在旋转期间禁用交叉淡入淡出?
笔记:
initialLayoutAttributesForAppearingItemAtIndexPath:文档声明默认情况下该方法返回nil但调用super返回的非零值.UICollectionView,deleteItemsAtIndexPaths:并且
moveItemAtIndexPath:toIndexPath:在旋转期间都没有命中它们.我有两个围绕屏幕移动的圆圈.圆圈都是包含其他UIViews的UIViews.每个圆圈外面的区域是透明的.
我写了一个函数来创建一个CGPath,它将两个圆形连接成四边形.我在透明的CALayer中填充此路径,该CALayer跨越整个屏幕.由于该层位于两个圆形UIViews的后面,因此它似乎可以连接它们.
最后,两个UIViews使用Core Animation进行动画制作.在此动画期间,两个圆的位置和大小都会改变.

到目前为止,我唯一获得成功的方法是使用NSTimer定期中断动画,然后根据圆圈presentationLayer的位置重新计算并绘制光束.然而,当动画加速时,四边形滞后于圆圈.
有没有更好的方法来使用Core Animation实现这一目标?或者我应该避免使用核心动画并使用NSTimer实现我自己的动画?
如果我创建一个子类UIView,并希望使用一堆定制的内容(通过动画CABasicAnimation使用CAShapeLayerS,定制的图形上使用CGContextRef的drawRect)当创建,添加和动画子层正确的时间?
我知道我应该在drawRect方法中执行自定义绘图(因为有一个地方,当我真的可以得到UIGraphicsGetCurrentContext()那种方式缩小我的选择).现在我一直在创建子图层,动画和所有其他非绘图相关的东西drawRect.但我不确定这drawRect是做这类活动的最佳地点.
我熟悉layoutSubviews方法和其他一些UIView方法,但除了实际上没有实现任何方法drawRect.
因此,如果我再重复一次 - 问题是:在哪里添加子图层,在哪里设置动画,是否有任何技巧或捕捉我应该注意?
我希望在没有动画的情况下从它的超级层中删除一个 CALayer。这里发生的是图层动画到一个位置,效果很好,但是当动画停止时,执行此代码,将图层返回到其起始位置,然后淡出;大概然后从超级层中移除。如何停止动画 -removeFromSuperlayer ?此处列出的代码对于取消注释和未取消注释的包含注释的所有变体、事务或无事务具有相同的行为。我错过了什么?
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
//[self setHidden: YES];
//[CATransaction flush];
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue
forKey:kCATransactionDisableActions];
//[CATransaction setDisableActions: YES];
//[CATransaction setAnimationDuration: 0];
[self removeFromSuperlayer];
[CATransaction commit];
}
Run Code Online (Sandbox Code Playgroud)
我一直在四处寻找,这段代码与我发现的没有任何不同。
我有一个CATextLayer类型的子层视图.我覆盖了视图drawRect:方法,并在那里将CATextLayer.string属性更改为NSAttributedString的实例.每次NSAttributedString具有相同的文本但具有不同的颜色.截至目前,每次字符串属性更改时,文本颜色都会将动画过渡到新颜色.
有什么办法可以禁用这个属性的动画吗?
我正在使用CABasicAnimation旋转CALayer并且工作正常.问题是,当我尝试旋转同一层时,它会在旋转之前返回到原始位置.我的预期输出是,对于下一轮,它应该从它结束的地方开始.这是我的代码:
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
animation.fromValue = 0;
animation.toValue = [NSNumber numberWithFloat:3.0];
animation.duration = 3.0;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;
animation.autoreverses = NO;
[calayer addAnimation:animation forKey:@"rotate"];
Run Code Online (Sandbox Code Playgroud)
我的代码上有什么遗漏?谢谢
我有一个UIView子类,当用户触摸它时,使用以下重写方法移动'event':
// In a custom UIView...
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
CGPoint point = [[touches anyObject] locationInView:self];
UIView *eventView = [self.ringOfEvents hitTest:point withEvent:event];
for (EventView *e in self.events) {
if (e == eventView) {
event.position = point;
}
}
}
Run Code Online (Sandbox Code Playgroud)
为什么当我制作EventViewCALayer而不是UIView时,运动会慢慢变成蠕动?我也可以发布该代码,但它是如此相似,以至于我认为没有必要.
我认为抽象到较低级别会加速事件处理,但我必须遗漏一些东西.
顺便说一句,如果*eventView是UIView或的子类CALayer,则position属性如下:
- (void)setPosition:(CGPoint)pos {
self.layer.position = pos;
}
- (CGPoint)position {
return self.layer.position;
}
Run Code Online (Sandbox Code Playgroud)
不知道为什么当使用UIView作为CALayer时,我的延迟会大大减少..
我使用这些代码来移动CALayer:
CGPoint position = self.position;
position.x += 10;
position.y += 10;
self.position = position;
Run Code Online (Sandbox Code Playgroud)
当我在没有任何动画调用的情况下更改图层的位置时,会有一个默认动画.当我在touchesMoved:withEvent:中使用这些代码时,这将导致图层移动滞后.
我想要做的是删除默认动画,并立即移动图层,以便它可以快速响应触摸事件,就像UIView的"中心"属性一样.
我该怎么办?特别的thx!
calayer ×7
ios ×6
iphone ×5
cocoa-touch ×4
animation ×3
uikit ×3
objective-c ×2
layer ×1
rotation ×1
uiview ×1