相关疑难解决方法(0)

你如何立即移动CALayer(没有动画)

我正在尝试在iOS应用中拖动CALayer.

一旦我改变它的位置属性,它就会尝试动画到新位置,并在整个地方闪烁:

 layer.position = CGPointMake(x, y)
Run Code Online (Sandbox Code Playgroud)

如何立即移动CALayers?我似乎无法理解Core Animation API.

cocoa-touch core-animation objective-c calayer ios

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

如何禁用CALayer隐式动画?

这让我疯狂!我正在制作绘图应用程序.假设我正在制作一张UIView名片.

我在这个视图([sheet.layer addSublayer:...])中添加了一些子图层然后我想要绘制它们.为此,我正在创建一个CGImageRef并将其放入图层中contents.但它是动画的,我不希望这样.

我尝试了一切:

  • removeAnimationForKey:
  • removeAllAnimations
  • 设置动作字典
  • 使用动作层 delegate
  • [CATransaction setDisableAnimations:YES]

这似乎是正确的.我不明白为什么这个图层仍然是动画的; _;
难道我做错了什么?有秘密的方式吗?

animation calayer ios

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

如何防止CALayer隐式动画?

当我设置实例的backgroundColor属性时CALayer,更改似乎有点动画.但在我的情况下,我不希望这样.如何设置backgroundColor无动画?

iphone calayer

16
推荐指数
4
解决办法
7532
查看次数

在UICollectionView/UICollectionViewLayout上禁用交叉淡入淡出的最佳最佳方法是旋转还是限制更改?

我有一个子类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方法上设置了符号断点 UICollectionView,deleteItemsAtIndexPaths:并且 moveItemAtIndexPath:toIndexPath:在旋转期间都没有命中它们.

iphone cocoa-touch uikit ios uicollectionview

14
推荐指数
1
解决办法
4141
查看次数

跟踪核心动画动画

我有两个围绕屏幕移动的圆圈.圆圈都是包含其他UIViews的UIViews.每个圆圈外面的区域是透明的.

我写了一个函数来创建一个CGPath,它将两个圆形连接成四边形.我在透明的CALayer中填充此路径,该CALayer跨越整个屏幕.由于该层位于两个圆形UIViews的后面,因此它似乎可以连接它们.

最后,两个UIViews使用Core Animation进行动画制作.在此动画期间,两个圆的位置和大小都会改变.

到目前为止,我唯一获得成功的方法是使用NSTimer定期中断动画,然后根据圆圈presentationLayer的位置重新计算并绘制光束.然而,当动画加速时,四边形滞后于圆圈.

有没有更好的方法来使用Core Animation实现这一目标?或者我应该避免使用核心动画并使用NSTimer实现我自己的动画?

cocoa-touch core-animation

12
推荐指数
1
解决办法
3393
查看次数

何时是在UIView子类中设置动画和添加子图层的正确时间

如果我创建一个子类UIView,并希望使用一堆定制的内容(通过动画CABasicAnimation使用CAShapeLayerS,定制的图形上使用CGContextRefdrawRect)当创建,添加和动画子层正确的时间?

我知道我应该在drawRect方法中执行自定义绘图(因为有一个地方,当我真的可以得到UIGraphicsGetCurrentContext()那种方式缩小我的选择).现在我一直在创建子图层,动画和所有其他非绘图相关的东西drawRect.但我不确定这drawRect是做这类活动的最佳地点.

我熟悉layoutSubviews方法和其他一些UIView方法,但除了实际上没有实现任何方法drawRect.

因此,如果我再重复一次 - 问题是:在哪里添加子图层,在哪里设置动画,是否有任何技巧或捕捉我应该注意?

animation objective-c calayer uiview ios

6
推荐指数
1
解决办法
2185
查看次数

无法禁用 CALayer>>removeFromSuperlayer 的动画

我希望在没有动画的情况下从它的超级层中删除一个 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)

我一直在四处寻找,这段代码与我发现的没有任何不同。

iphone core-animation calayer uikit

4
推荐指数
1
解决办法
2360
查看次数

禁用CATextLayer.string属性的隐式动画

我有一个CATextLayer类型的子层视图.我覆盖了视图drawRect:方法,并在那里将CATextLayer.string属性更改为NSAttributedString的实例.每次NSAttributedString具有相同的文本但具有不同的颜色.截至目前,每次字符串属性更改时,文本颜色都会将动画过渡到新颜色.

有什么办法可以禁用这个属性的动画吗?

animation layer ios

4
推荐指数
1
解决办法
2001
查看次数

CABasicAnimation旋转返回原始位置

我正在使用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)

我的代码上有什么遗漏?谢谢

rotation calayer cabasicanimation ios

3
推荐指数
1
解决办法
7573
查看次数

为什么CALayer的移动速度比UIView慢?

我有一个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时,运动会慢慢变成蠕动?我也可以发布该代码,但它是如此相似,以至于我认为没有必要.

我认为抽象到较低级别会加速事件处理,但我必须遗漏一些东西.

顺便说一句,如果*eventViewUIView或的子类CALayer,则position属性如下:

- (void)setPosition:(CGPoint)pos {
    self.layer.position = pos;
}

- (CGPoint)position {
    return self.layer.position;
}
Run Code Online (Sandbox Code Playgroud)

不知道为什么当使用UIView作为CALayer时,我的延迟会大大减少..

iphone cocoa-touch core-animation uikit

3
推荐指数
1
解决办法
1728
查看次数

如何更改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!

iphone core-animation calayer

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