Заголовок Песни iTunes, Прокручивающий в Какао

Я искал экстенсивно и не могу ни за что в жизни найти информацию о том, как достигнуть подобного эффекта к той из прокрутки заголовка песни iTunes, если текст слишком крупен в Какао. Я попытался установить границы на NSTextField напрасно. Я попытался использовать NSTextView, а также различные попытки использования NSScrollView. Я уверен, что пропускаю что-то простое, но любая справка значительно ценилась бы. Я также надеюсь не должным быть использовать CoreGraphics если вообще возможный.

Пример, заметьте "Основу. FM http://www". текст был прокручен. Если Вы нуждаетесь в лучшем примере открытый iTunes с песней с довольно большим заголовком и наблюдаете, что он прокручивает назад и вперед.

Я думал бы, конечно, существует простой способ просто создать эффект типа пунктирной рамки с NSTextField и NSTimer, но увы.

7
задан Alex Winston 12 July 2010 в 22:33
поделиться

1 ответ

Я понимаю, как это может быть сложно, если вы пытаетесь впихнуть функциональность в существующий элемент управления. Однако, если вы просто начнете с обычного NSView, это не так уж плохо. Я сделал это примерно за 10 минут...

//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". Затем (в коде), вы делаете:

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

Это, очевидно, довольно примитивно, но это делает то, что вы ищете, и является достойным местом для начала.

19
ответ дан 6 December 2019 в 09:58
поделиться