2010-07-12 6 views
6

में मैं बड़े पैमाने पर खोज की है और नहीं मेरे जीवन के लिए कैसे iTunes शीर्षक गीत है, तो पाठ कोको में बहुत बड़ी है स्क्रॉल की है कि एक समान प्रभाव को प्राप्त करने के बारे में कोई जानकारी पा सकते हैं। मैंने किसी भी लाभ के लिए एनएसटीक्स्टफिल्ल्ड पर सीमा निर्धारित करने का प्रयास किया है। मैंने NSTextView का उपयोग करने के साथ-साथ NSScrollView का उपयोग करने के विभिन्न प्रयासों का उपयोग करने का प्रयास किया है। मुझे यकीन है कि मुझे कुछ आसान याद आ रहा है लेकिन किसी भी मदद की सराहना की जाएगी। मैं उम्मीद कर रहा हूं कि यदि संभव हो तो कोरग्राफिक्स का उपयोग न करें।iTunes गाने के शीर्षक स्क्रॉल कोको

Example, "Base.FM http://www।" नोटिस पाठ स्क्रॉल किया गया है। यदि आपको एक बेहतर उदाहरण की आवश्यकता है तो एक गीत के साथ एक बड़े शीर्षक के साथ iTunes खोलें और इसे आगे और पीछे स्क्रॉल करें।

मुझे लगता है कि होगा निश्चित रूप से वहाँ सिर्फ एक NSTextField और एक NSTimer, लेकिन अफसोस के साथ एक मार्की प्रकार प्रभावी बनाने के लिए एक आसान तरीका है।

उत्तर

18

मैं देख सकता हूँ यह कितना मुश्किल हो सकता है अगर आप एक अस्तित्व नियंत्रण में कार्यक्षमता जूता पहनने का साधन करने की कोशिश कर रहे हैं। हालांकि, अगर आप सिर्फ एक सादे 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 खींचें और अपने वर्ग के लिए "ScrollingTextView" में बदलें। तब (कोड में), है न:

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

यह स्पष्ट रूप से सुंदर अल्पविकसित है, लेकिन यह सामान चारों ओर रैप कि आप देख रहे हैं करता है और शुरू करने के लिए एक सभ्य जगह है।

+0

काम करता है एक विजेता की तरह। मुझे विश्वास नहीं है कि मुझे इंटरनेट पर कोई भी उदाहरण नहीं मिल सका। शायद अब यह बहुत आसान है कि मैं आपका समाधान देखता हूं। –

+0

शायद यही कारण है क्योंकि इसकी तरह एक यूआई विरोधी पैटर्न। कुछ कारणों के लिए मुख्य है कि किसी भी समय है उपयोगकर्ता यह देखता है कि, यह जानकारी है कि वे चाहते हैं दिखा होने जा रही है? शायद ऩही। – EricLeaf

संबंधित मुद्दे