我有一個類型爲CATextLayer的子圖層。我重寫視圖drawRect:方法,並在那裏將CATextLayer.string屬性更改爲NSAttributedString的一個實例。每次NSAttributedString具有相同的文本但具有不同的顏色。從現在開始,每當字符串屬性發生更改時,文本顏色都會將動畫轉換爲新顏色。禁用CATextLayer.string的隱式動畫屬性
有沒有什麼辦法可以禁用此屬性的動畫?
我有一個類型爲CATextLayer的子圖層。我重寫視圖drawRect:方法,並在那裏將CATextLayer.string屬性更改爲NSAttributedString的一個實例。每次NSAttributedString具有相同的文本但具有不同的顏色。從現在開始,每當字符串屬性發生更改時,文本顏色都會將動畫轉換爲新顏色。禁用CATextLayer.string的隱式動畫屬性
有沒有什麼辦法可以禁用此屬性的動畫?
想通了,利用這個問題的答案:Disabling implicit animations in -[CALayer setNeedsDisplayInRect:]
在我的具體情況,從停止CATextLayer.string
屬性的變化被動畫,該代碼已經足夠:
NSDictionary *newActions = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNull null], @"contents", nil];
textLayer.actions = newActions;
[newActions release];
換句話說,contents
鍵似乎會禁用對CATextLayer.string
屬性所做更改的動畫。
更好的解決方案是使用一個CATransaction
塊禁用像這樣的動畫:
目標C
[CATransaction begin];
[CATransaction setDisableActions:YES];
myTextLayer.string = @"Hello world";
[CATransaction commit];
夫特:
CATransaction.begin()
CATransaction.setDisableActions(true)
myTextLayer.string = "Hello world"
CATransaction.commit()
要禁用惱人的(模糊)的動畫當更改CATextLayer的字符串屬性時,可以這樣做:
class CANullAction: CAAction {
private static let CA_ANIMATION_CONTENTS = "contents"
@objc
func runActionForKey(event: String, object anObject: AnyObject, arguments dict: [NSObject : AnyObject]?) {
// Do nothing.
}
}
然後像這樣使用它(不要忘記正確設置您的CATextLayer,例如正確的字體等):
caTextLayer.actions = [CANullAction.CA_ANIMATION_CONTENTS: CANullAction()]
你可以看到我的CATextLayer的完整安裝位置:
private let systemFont16 = UIFont.systemFontOfSize(16.0)
caTextLayer = CATextLayer()
caTextLayer.foregroundColor = UIColor.blackColor().CGColor
caTextLayer.font = CGFontCreateWithFontName(systemFont16.fontName)
caTextLayer.fontSize = systemFont16.pointSize
caTextLayer.alignmentMode = kCAAlignmentCenter
caTextLayer.drawsAsynchronously = false
caTextLayer.actions = [CANullAction.CA_ANIMATION_CONTENTS: CANullAction()]
caTextLayer.contentsScale = UIScreen.mainScreen().scale
caTextLayer.frame = CGRectMake(playbackTimeImage.layer.bounds.origin.x, ((playbackTimeImage.layer.bounds.height - playbackTimeLayer.fontSize)/2), playbackTimeImage.layer.bounds.width, playbackTimeLayer.fontSize * 1.2)
uiImageTarget.layer.addSublayer(caTextLayer)
caTextLayer.string = "The text you want to display"
現在,只要你想你=可以更新caTextLayer.string多)
不適合我。 http://stackoverflow.com/questions/21574661/uitableviewcell-label-displayed-with-little-slide-up-animation – Geek 2014-02-07 17:12:53
我結合你的答案與這一個:http://stackoverflow.com/questions/2244147/disabling-隱式動畫在calayer中setneedsdisplayinrect/33426124#33426124以禁用動畫。我認爲更容易實施。 – 2016-03-11 20:17:36