Scrolling Text - How to do it???

Discussion in 'iOS Programming' started by BrooklynDon, Jan 13, 2011.

  1. macrumors newbie

    Joined:
    Jan 10, 2011
    #1
    Hello folks!
    I would like to scroll some text. I have it in a 280 X 31 label. The width will be variable and corresponds to a text file I have saved on our webpage thru a PHP script. TIA!
     
  2. Moderator emeritus

    robbieduncan

    Joined:
    Jul 24, 2002
    Location:
    London
    #2
    Put the label in a UIScrollView. Hide the scroll bars. Let the label autosize to fit the content. Scroll the scrollview to scroll the text.
     
  3. macrumors 6502

    Joined:
    Jan 6, 2008
    #3
    Are you talking about a scrollable UILabel? Here is code that I use that works very well.

    Code:
    //
    //  AutoScrollLabel.h
    //  AutoScrollLabel
    //
    //  Created by Brian Stormont on 10/21/09.
    //  Copyright 2009 Stormy Productions. All rights reserved.
    //
    //  Permission is granted to use this code free of charge for any project.
    //
    
    #import <UIKit/UIKit.h>
    
    #define NUM_LABELS 2
    
    enum AutoScrollDirection {
    	AUTOSCROLL_SCROLL_RIGHT,
    	AUTOSCROLL_SCROLL_LEFT,
    };
    
    @interface AutoScrollLabel : UIScrollView <UIScrollViewDelegate>{
    	UILabel *label[NUM_LABELS];
    	enum AutoScrollDirection scrollDirection;
    	float scrollSpeed;
    	NSTimeInterval pauseInterval;
    	int bufferSpaceBetweenLabels;
    	bool isScrolling;
    }
    @property(nonatomic) enum AutoScrollDirection scrollDirection;
    @property(nonatomic) float scrollSpeed;
    @property(nonatomic) NSTimeInterval pauseInterval;
    @property(nonatomic) int bufferSpaceBetweenLabels;
    // normal UILabel properties
    @property(nonatomic,retain) UIColor *textColor;
    @property(nonatomic, retain) UIFont *font;
    
    - (void) readjustLabels;
    - (void) setText: (NSString *) text;
    - (NSString *) text;
    - (void) scroll;
    
    
    @end
    
    Code:
    
    //
    //  AutoScrollLabel.m
    //  AutoScrollLabel
    //
    //  Created by Brian Stormont on 10/21/09.
    //  Copyright 2009 Stormy Productions. 
    //
    //  Permission is granted to use this code free of charge for any project.
    //
    
    #import "AutoScrollLabel.h"
    
    #define LABEL_BUFFER_SPACE 50   // pixel buffer space between scrolling label
    #define DEFAULT_PIXELS_PER_SECOND 100
    #define DEFAULT_PAUSE_TIME 1.5f
    
    @implementation AutoScrollLabel
    @synthesize pauseInterval;
    @synthesize bufferSpaceBetweenLabels;
    
    - (void) commonInit
    {
    	for (int i=0; i< NUM_LABELS; ++i){
    		label[i] = [[UILabel alloc] init];
    		label[i].textColor = [UIColor whiteColor];
    		label[i].backgroundColor = [UIColor clearColor];
    		[self addSubview:label[i]];
    	}
    	
    	scrollDirection = AUTOSCROLL_SCROLL_LEFT;
    	scrollSpeed = DEFAULT_PIXELS_PER_SECOND;
    	pauseInterval = DEFAULT_PAUSE_TIME;
    	bufferSpaceBetweenLabels = LABEL_BUFFER_SPACE;
    	self.showsVerticalScrollIndicator = NO;
    	self.showsHorizontalScrollIndicator = NO;
    	self.userInteractionEnabled = NO;
    }
    
    -(id) init
    {
    	if (self = [super init]){
            // Initialization code
    		[self commonInit];
    	}
    	
    	return self;
    }
    
    - (id)initWithCoder:(NSCoder *)aDecoder
    {
        if (self = [super initWithCoder:aDecoder]) {
            // Initialization code
    		[self commonInit];
        }
        return self;
    	
    }
    
    
    - (id)initWithFrame:(CGRect)frame {
        if (self = [super initWithFrame:frame]) {
            // Initialization code
    		[self commonInit];
        }
        return self;
    }
    
    
    #if 0
    - (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
    {
    	[NSThread sleepForTimeInterval:pauseInterval];
    
    	isScrolling = NO;
    	
    	if ([finished intValue] == 1 && label[0].frame.size.width > self.frame.size.width){
    		[self scroll];
    	}	
    }
    #else
    - (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
    {
    	isScrolling = NO;
    
    	if ([finished intValue] == 1 && label[0].frame.size.width > self.frame.size.width){
    		[NSTimer scheduledTimerWithTimeInterval:pauseInterval target:self selector:@selector(scroll) userInfo:nil repeats:NO];
    	}
    } 
    #endif
    
    
    - (void) scroll
    {
    	// Prevent multiple calls
    	if (isScrolling){
    //		return;
    	}
    	isScrolling = YES;
    	
    	if (scrollDirection == AUTOSCROLL_SCROLL_LEFT){
    		self.contentOffset = CGPointMake(0,0);
    	}else{
    		self.contentOffset = CGPointMake(label[0].frame.size.width+LABEL_BUFFER_SPACE,0);
    	}
    	
    	[UIView beginAnimations:@"scroll" context:nil];
        [UIView setAnimationDelegate:self];
    	[UIView setAnimationCurve:UIViewAnimationCurveLinear];
    	[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
    	[UIView setAnimationDuration:label[0].frame.size.width/(float)scrollSpeed];
    	
    	if (scrollDirection == AUTOSCROLL_SCROLL_LEFT){
    		self.contentOffset = CGPointMake(label[0].frame.size.width+LABEL_BUFFER_SPACE,0);
    	}else{
    		self.contentOffset = CGPointMake(0,0);
    	}		
    	
    	[UIView commitAnimations];
    }
    
    
    - (void) readjustLabels
    {
    	float offset = 0.0f;
    	
    	for (int i = 0; i < NUM_LABELS; ++i){
    		[label[i] sizeToFit];
    		
    		// Recenter label vertically within the scroll view
    		CGPoint center;
    		center = label[i].center;
    		center.y = self.center.y - self.frame.origin.y;
    		label[i].center = center;
    		
    		CGRect frame;
    		frame = label[i].frame;
    		frame.origin.x = offset;
    		label[i].frame = frame;
    		
    		offset += label[i].frame.size.width + LABEL_BUFFER_SPACE;
    	}
    	
    	CGSize size;
    	size.width = label[0].frame.size.width + self.frame.size.width + LABEL_BUFFER_SPACE;
    	size.height = self.frame.size.height;
    	self.contentSize = size;
    
    	[self setContentOffset:CGPointMake(0,0) animated:NO];
    	
    	// If the label is bigger than the space allocated, then it should scroll
    	if (label[0].frame.size.width > self.frame.size.width){
    		for (int i = 1; i < NUM_LABELS; ++i){
    			label[i].hidden = NO;
    		}
    		[self scroll];
    	}else{
    		// Hide the other labels out of view
    		for (int i = 1; i < NUM_LABELS; ++i){
    			label[i].hidden = YES;
    		}
    		// Center this label
    		CGPoint center;
    		center = label[0].center;
    		center.x = self.center.x - self.frame.origin.x;
    		label[0].center = center;
    	}
    
    }
    
    
    - (void) setText: (NSString *) text
    {
    	// If the text is identical, don't reset it, otherwise it causes scrolling jitter
    	if ([text isEqualToString:label[0].text]){
    		// But if it isn't scrolling, make it scroll
    		// If the label is bigger than the space allocated, then it should scroll
    		if (label[0].frame.size.width > self.frame.size.width){
    			[self scroll];
    		}
    		return;
    	}
    	
    	for (int i=0; i<NUM_LABELS; ++i){
    		label[i].text = text;
    	}
    	[self readjustLabels];
    }	
    - (NSString *) text
    {
    	return label[0].text;
    }
    
    
    - (void) setTextColor:(UIColor *)color
    {
    	for (int i=0; i<NUM_LABELS; ++i){
    		label[i].textColor = color;
    	}
    }
    
    - (UIColor *) textColor
    {
    	return label[0].textColor;
    }
    
    
    - (void) setFont:(UIFont *)font
    {
    	for (int i=0; i<NUM_LABELS; ++i){
    		label[i].font = font;
    	}
    	[self readjustLabels];
    }
    
    - (UIFont *) font
    {
    	return label[0].font;
    }
    
    
    - (void) setScrollSpeed: (float)speed
    {
    	scrollSpeed = speed;
    	[self readjustLabels];
    }
    
    - (float) scrollSpeed
    {
    	return scrollSpeed;
    }
    
    - (void) setScrollDirection: (enum AutoScrollDirection)direction
    {
    	scrollDirection = direction;
    	[self readjustLabels];
    }
    
    - (enum AutoScrollDirection) scrollDirection
    {
    	return scrollDirection;
    }
    
    - (void)dealloc {
    	for (int i=0; i<NUM_LABELS; ++i){
    		[label[i] release];
    	}
        [super dealloc];
    }
    
    
    @end
    
     

Share This Page