iTunes 歌曲标题在 Cocoa 中滚动 [英] iTunes Song Title Scrolling in Cocoa
问题描述
我已经进行了广泛的搜索,但在我的一生中找不到任何关于如何在 Cocoa 中的文本太大的情况下实现与 iTunes 歌曲标题滚动类似的效果的信息.我试过在 NSTextField 上设置边界无济于事.我尝试过使用 NSTextView 以及使用 NSScrollView 的各种尝试.我确信我遗漏了一些简单的东西,但任何帮助将不胜感激.如果可能的话,我也希望不必使用 CoreGraphics.
I have searched extensively and cannot for the life of me find any information about how to achieve a similar effect to that of the iTunes song title scrolling if the text is too large in Cocoa. I have tried setting the bounds on a NSTextField to no avail. I have tried using NSTextView as well as various attempts at using NSScrollView. I am sure I am missing something simple but any help would be greatly appreciated. I am also hoping to not have to use CoreGraphics if at all possible.
示例,请注意"Base.FM http://www."文本已滚动.如果您需要更好的示例,请打开 iTunes 并打开标题较大的歌曲,然后来回滚动观看.
Example, notice the "Base.FM http://www." text has been scrolled. If you need a better example open iTunes with a song with a rather large title and watch it scroll back and forth.
我认为肯定有一种简单的方法可以使用 NSTextField 和 NSTimer 创建选取框类型的效果,但是很可惜.
I would think surely there is a simple way to just create a marquee type effect with an NSTextField and an NSTimer, but alas.
推荐答案
如果您试图将功能硬塞到现有控件中,这将是多么困难.然而,如果你只是从一个普通的 NSView 开始,它并没有那么糟糕.我在大约 10 分钟内完成了这个......
I can see how this would be difficult if you're trying to shoehorn the functionality into an exist control. However, if you just start with a plain NSView, it's not that bad. I whipped this up in about 10 minutes...
//ScrollingTextView.h:
#import <Cocoa/Cocoa.h>
@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
只需将 NSView 拖到 Interface Builder 中的窗口上,并将其类更改为ScrollingTextView".然后(在代码中),你做:
Just drag an NSView onto your window in Interface Builder and change its class to "ScrollingTextView". Then (in code), you do:
[myScrollingTextView setText:@"This is the text I want to scroll"];
[myScrollingTextView setSpeed:0.01]; //redraws every 1/100th of a second
这显然是非常初级的,但它包含了您正在寻找的东西,并且是一个不错的起点.
This is obviously pretty rudimentary, but it does the wrap around stuff that you're looking for and is a decent place to start.
这篇关于iTunes 歌曲标题在 Cocoa 中滚动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!