【问题标题】:Animating label (NSTextField) horizontally水平动画标签(NSTextField)
【发布时间】:2012-11-13 22:59:20
【问题描述】:

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

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

Core Animation 有其他方法吗?

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

但我也没有让它工作。

非常感谢您的帮助。

【问题讨论】:

  • 它是用计时器完成的,这正是我想要避免的。
  • 我不是可可动画的大师。 NSAnimation 会做 butttttt... 它再次隐式使用计时器调用。
  • @AnoopVaidya 不确定这是否是我要找的...
  • 这是一个使用 UILabel 的实现。简单地看了一下,但看起来他们正在使用 Core Animation。 github.com/cbpowell/MarqueeLabel

标签: objective-c xcode macos cocoa nstextfield


【解决方案1】:

你可以简单地用类似动画的动画器来动画 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 中即可。

【讨论】:

  • 这不是我真正想要的。这组是整个标签的位置。我想在它旁边显示一张图片,它们会重叠。
  • 然后你可以在包含标签的 UIView 上添加上面的代码。标签不会超出视图,因此它充当“边距”。同样,bringSubviewToFront 会防止图像重叠。
  • @k20 谢谢,我想这真的可以做到!
  • @NSAddict 非常欢迎您,我将其添加为答案,以防其他人也想和您一样
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    相关资源
    最近更新 更多