水平制作动画标签(NSTextField)

时间:2012-11-26 12:57:17

标签: objective-c xcode macos cocoa nstextfield

我有NSTextField作为标签,显示一个字符串。 如果标签的内容太大而无法一次显示,我想从右到左为该标签设置动画。

到目前为止,我用NSTimer完成了这项工作,但它确实有效,但这不是一个很好的解决方案。 标签显示在表视图中的NSTextFieldCell中。 它们经常不同步,我猜它只占用了大量的CPU / GPU资源。

Core Animation还有另一种方法吗?

我已尝试使用图层,您可以在此处看到: CALayer and drawRect

但我也没有让它发挥作用。

我真的很感谢你的帮助。

2 个答案:

答案 0 :(得分:7)

您可以使用像

这样的动画师简单地为NSTextField的位置设置动画
[[textField animator] setFrameOrigin:NSMakePoint(x,y)];

您也可以将其嵌入“CATrancation”代码中,如下所示:

[CATransaction begin];
[CATransaction setAnimationDuration:0.5];
[CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]];
[[textField animator] setFrameOrigin:NSMakePoint(x,y)];
[CATransaction commit];

如果您需要动画委托,可以使用CABasicAnimation

CABasicAnimation* animation = [CABasicAnimation animation];
animation.delegate = self;
NSDictionary *animations = [NSDictionary dictionaryWithObjectsAndKeys:animation,@"frameOrigin",nil]; 
[textField setAnimations:animations];
[[textField animator] setFrameOrigin:NSMakePoint(x,y)];

委托方法

- (void)animationDidStart:(CAAnimation *)theAnimation;
- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag;

如果您需要屏蔽文本字段,只需将其嵌入其他NSView。

答案 1 :(得分:1)

首先,使用其他答案中提供的功能之一为该标签设置动画。  然后,如果要在侧面显示另一个视图而不重叠,您可以:

  • 在带有您希望的限制的子视图中插入标签
  • 使用bringSubviewtoFront:或sendSubviewToBack:确保您的标签留在后面