Animating label (NSTextField) horizontally
cocoa, macos, nstextfield, objective-c, xcode
Solution
You can simply animate the position of NSTextField with animator like
[[textField animator] setFrameOrigin:NSMakePoint(x,y)];
you can also embed it in "CATrancation" code like this:
[CATransaction begin];
[CATransaction setAnimationDuration:0.5];
[CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]];
[[textField animator] setFrameOrigin:NSMakePoint(x,y)];
[CATransaction commit];
if you need animation delegate, you can use CABasicAnimation
CABasicAnimation* animation = [CABasicAnimation animation];
animation.delegate = self;
NSDictionary *animations = [NSDictionary dictionaryWithObjectsAndKeys:animation,@"frameOrigin",nil];
[textField setAnimations:animations];
[[textField animator] setFrameOrigin:NSMakePoint(x,y)];
Delegate methods are
- (void)animationDidStart:(CAAnimation *)theAnimation;
- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag;
If you need to mask your text field, just embed it in other NSView.
Problem
I have a `NSTextField` as a label, showing a string. I want to animate this label from right to left, if the content of it is too large to be displayed at once. I've done this with an `NSTimer` so far, it works, but it's just not a very good solution. The labels are displayed in an `NSTextFieldCell`, in a Table View. They often get out of sync, and I guess it's just eating up a lot of CPU/GPU resources. Is there another way with `Core Animation` to do this? I have tried it with layers, as you can see right here: CALayer and drawRect but I didn't get it working either. I would really appreciate your help.