[CALayer setNeedsDisplayInRect:]

我有一个在其-drawInContext:方法中有一些复杂绘图代码的图层。 我想尽量减少我需要做的绘图数量,所以我使用-setNeedsDisplayInRect:只更新更改的部分。 这非常出色。 但是,当图形系统更新我的图层时,它将使用交叉渐变从旧图像转换为新图像。 我想立即切换。

我试过使用CATransaction来关闭操作并将持续时间设置为零,但都不起作用。 以下是我正在使用的代码:

[CATransaction begin];
[CATransaction setDisableActions: YES];
[self setNeedsDisplayInRect: rect];
[CATransaction commit];

我应该使用CATransaction有不同的方法(我也试过-setValue:forKey:with kCATransactionDisableActions,结果相同)。


您可以通过设置图层上的动作字典将[NSNull null]为相应键的动画来实现。 例如,我使用

NSDictionary *newActions = @{
    @"onOrderIn": [NSNull null],
    @"onOrderOut": [NSNull null],
    @"sublayers": [NSNull null],
    @"contents": [NSNull null],
    @"bounds": [NSNull null]
};

layer.actions = newActions;

在插入或更改某个图层内的子图层时禁用淡入/淡出动画,以及图层大小和内容的更改。 我相信contents关键是你正在寻找的,以防止更新图纸上的交叉淡入淡出。


也:

[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];

//foo

[CATransaction commit];

当您更改图层的属性时,CA通常会创建一个隐式事务对象来为更改设置动画。 如果您不想动画更改,则可以通过创建显式事务并将其kCATransactionDisableActions属性设置为true来禁用隐式动画。

Objective-C的

[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
// change properties here without animation
[CATransaction commit];

迅速

CATransaction.begin()
CATransaction.setValue(kCFBooleanTrue, forKey: kCATransactionDisableActions)
// change properties here without animation
CATransaction.commit()
链接地址: http://www.djcxy.com/p/74161.html

上一篇: [CALayer setNeedsDisplayInRect:]

下一篇: Observing animated property changes in a CALayer