【问题标题】:How to Scroll the text in label automatically如何自动滚动标签中的文本
【发布时间】:2014-07-24 09:48:49
【问题描述】:

我有一个数组,它的数据使用 UILabel 显示在滚动视图上。我可以左右滚动。但我想再添加一项功能,即在滚动视图上自动滚动标签文本。这意味着即使我不滚动,我也希望它自行移动。 我的滚动代码如下:

- (void)viewDidLoad
{
    [super viewDidLoad];

    _scrollView.contentInset=UIEdgeInsetsMake(0, 300, 0, 300);

    NSMutableArray *items=[[NSMutableArray alloc] initWithObjects:@"A walk to remember",@"The Last song",@"The Notebook",@"Dear John",@"The Longest Ride",nil];

    CGFloat y = 10;
    self.label = [[UILabel alloc]initWithFrame:CGRectMake(0,y,800, 25)];

    for(int i=0;i<[items count];i++){
          y+=20;        
         NSString* lab=[items objectAtIndex:i];
        _label.backgroundColor=[UIColor clearColor];
        lab=[items componentsJoinedByString:@" | "];
        NSLog(@"label:%@",lab);
        [self.label setLineBreakMode:NSLineBreakByWordWrapping];
        [self.label setText:lab];     
    }   

    NSTimer *timer = [NSTimer timerWithTimeInterval:1
                                             target:self
                                           selector:@selector(timer)
                                           userInfo:nil
                                            repeats:YES];
    [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 

    //[_scrollView scrollRectToVisible:NSMakeRange(0,0,0.0) animated:YES]; 
    [_scrollView addSubview:_label];
    [UIView commitAnimations];    

    _scrollView.contentSize=CGSizeMake(_scrollView.frame.size.width*[items count], _scrollView.frame.size.height);   
    }

定时器代码:

-(void)timer {

[self.label setText:[NSString stringWithFormat:@" %@", self.label.text]];

}

请帮助我如何使标签文本水平移动。感谢您的帮助

【问题讨论】:

  • 我认为这是在滚动视图上添加标签的代码。没有动画代码。可以加个时间码吗?
  • 这段代码让我的文字现在自动移动。但是从左到右。我希望它从右向左移动并再次重复。
  • 只需尝试使用AutoScrollLabel。这将帮助你....
  • 非常感谢 N J Gadhiya,它成功了 :)

标签: objective-c ios7 uiscrollview nstimer


【解决方案1】:

如果可以的话,那是实现滚动的一种相当可怕的方式!您通过在字符串左侧插入增量空格来滚动。有一种更简单的方法可以做到这一点!

  • 保留将 UILabel 添加到滚动视图的代码
  • 摆脱 NSTimer 的东西
  • 添加一个基本的 UIView 动画来为滚动视图的内容偏移设置动画。

类似这样的:

[UIView animateWithDuration:0.3f delay:0.0f options:UIViewAnimationOptionCurveEaseInOut animations:^{
        _scrollview.contentOffset = CGPointMake(-50.0f, 0.0f);
    } completion:nil];

这将使整个滚动视图在 0.3 秒内向左滑动 50 个点。你可以玩弄这些设置。

顺便说一句,通常你会在 viewDidLoad 中创建 UILabel(就像你拥有的那样),但将动画放在 viewWillAppear 或 viewDidAppear 中

再次查看您的代码。我以为您正在向 uiscrollview 添加多个 UILabel,但实际上您只添加了一个带有长文本字符串的 UILabel。

你可以简化你的代码来设置标签,然后按照下面的实现滚动动画。

NSMutableArray *items=[[NSMutableArray alloc] initWithObjects:@"A walk to remember",@"The Last song",@"The Notebook",@"Dear John",@"The Longest Ride",nil];

CGFloat y = 10;
self.label = [[UILabel alloc]initWithFrame:CGRectMake(0,y,800, 25)];
[self.label setLineBreakMode:NSLineBreakByWordWrapping];
[self.label setBackgroundColor: [UIColor clearColor]];
[self.label setText: [items componentsJoinedByString:@" | "]];

编辑

关于如何显示整行滚动然后重复的问题,这里有几个步骤。

  • 使 UILabel 足够宽以将所有文本放在一行 - 即增加宽度,使其足够大以容纳所有文本。您可以通过反复试验或使用(CGSize)sizeThatFits:(CGSize)size 来做到这一点

获取大小。您调用 CGSize size = self.label sizeThatFits:CGSizeMake(CGFloatMax, self.label.frame.size.height) 来获取尺寸,然后将其应用于标签的框架:

CGRect frame = self.label.frame;
frame.size.width = size.width; //calculated above with sizeThatFits
self.label.frame = frame; //update the frame
  • 现在滚动滚动视图的整个宽度。所以 animateWithDuration 代码会变成:

    _scrollview.contentOffset = CGPointMake(-size.width, 0.0f);

  • 最后一步是如何让它在结束后重新启动。不知道你想要什么效果?它应该跳回到起点吗? (如果是这样,请将 contentOffset x 设置为零),还是继续滚动? (如果是这样,请使用一种技巧,例如在第一个 UILabel 的末尾添加第二个。

顺便说一句,如果你想要的是一个简单的滚动文本,比如网页上的横幅,那么我建议你根本不要理会滚动视图。而是将 UILabel 添加到 self.view 中,然后直接为 UILabel 的帧原点设置动画。

【讨论】:

  • 但这不会让我的文字自动移动
  • 应该可以——你试过了吗?也许让它移动得更慢(将 0.3f 更改为 5.0f)并进一步(将 -50.0f 更改为 -200.0f)。另一种方法是将 UILabel 的框架向左移动。
  • 谢谢。但是要将字符串从开头移动到结尾,一旦它结束,我想再次从头开始。为此我需要做什么?
  • 是的,我改变了要点。但它会一直持续到一半并停止。如果我点击它,它会到达这个位置并且是静态的
  • 在我的回复中添加了更多内容 - hth
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-30
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多