IluTov
IluTov

Reputation: 6852

Animating label (NSTextField) horizontally

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.

Upvotes: 4

Views: 2326

Answers (2)

Remizorrr
Remizorrr

Reputation: 2322

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.

Upvotes: 8

k20
k20

Reputation: 2008

First, animate the label using one of the functions offered in the other answers. Then, if you want to display another view on the sides without overlapping, you can:

  • Insert the label in a subview with the limits you wish
  • Use bringSubviewtoFront: or sendSubviewToBack: to make sure your label stays in the back

Upvotes: 1

Related Questions