Título de la canción de iTunes desplazándose en cocoa

He buscado mucho y no puedo encontrar información sobre cómo lograr un efecto similar al del título de la canción de iTunes desplazándose si el texto es demasiado grande en Cocoa. He intentado establecer los límites en un NSTextField inútilmente. He intentado usar NSTextView así como varios bashs de usar NSScrollView. Estoy seguro de que me falta algo simple, pero cualquier ayuda sería muy apreciada. También espero no tener que usar CoreGraphics si es posible.

Ejemplo , observe el “Base.FM http: // www .” el texto ha sido desplazado. Si necesita un mejor ejemplo, abra iTunes con una canción con un título bastante grande y mire cómo se desplaza hacia adelante y hacia atrás.

Creo que seguramente hay una manera simple de crear un efecto de tipo marquesina con un NSTextField y un NSTimer, pero por desgracia.

Puedo ver cómo esto sería difícil si estás tratando de calzar la funcionalidad en un control existente. Sin embargo, si solo comienzas con un NSView simple, no es tan malo. Arreglé esto en unos 10 minutos …

//ScrollingTextView.h: #import  @interface ScrollingTextView : NSView { NSTimer * scroller; NSPoint point; NSString * text; NSTimeInterval speed; CGFloat stringWidth; } @property (nonatomic, copy) NSString * text; @property (nonatomic) NSTimeInterval speed; @end //ScrollingTextView.m #import "ScrollingTextView.h" @implementation ScrollingTextView @synthesize text; @synthesize speed; - (void) dealloc { [text release]; [scroller invalidate]; [super dealloc]; } - (void) setText:(NSString *)newText { [text release]; text = [newText copy]; point = NSZeroPoint; stringWidth = [newText sizeWithAttributes:nil].width; if (scroller == nil && speed > 0 && text != nil) { scroller = [NSTimer scheduledTimerWithTimeInterval:speed target:self selector:@selector(moveText:) userInfo:nil repeats:YES]; } } - (void) setSpeed:(NSTimeInterval)newSpeed { if (newSpeed != speed) { speed = newSpeed; [scroller invalidate]; scroller == nil; if (speed > 0 && text != nil) { scroller = [NSTimer scheduledTimerWithTimeInterval:speed target:self selector:@selector(moveText:) userInfo:nil repeats:YES]; } } } - (void) moveText:(NSTimer *)timer { point.x = point.x - 1.0f; [self setNeedsDisplay:YES]; } - (void)drawRect:(NSRect)dirtyRect { // Drawing code here. if (point.x + stringWidth < 0) { point.x += dirtyRect.size.width; } [text drawAtPoint:point withAttributes:nil]; if (point.x < 0) { NSPoint otherPoint = point; otherPoint.x += dirtyRect.size.width; [text drawAtPoint:otherPoint withAttributes:nil]; } } @end 

Simplemente arrastre un NSView a su ventana en Interface Builder y cambie su clase a "ScrollingTextView". Luego (en el código), haces:

 [myScrollingTextView setText:@"This is the text I want to scroll"]; [myScrollingTextView setSpeed:0.01]; //redraws every 1/100th of a second 

Esto es, obviamente, bastante rudimentario, pero cumple las funciones que está buscando y es un buen lugar para comenzar.