滚动UILabel像子视图中的一个选取框

我在主视图中有一个UILabel文本 – “非常非常长的文本” 。 适当的宽度是142,但我缩短到55。

基本上我想实现一个选取框types滚动,所以我写了代码将其添加到子视图,并在该视图的范围内animation。

代码

CGRect tempLblFrame = _lblLongText.frame; UIView *lblView = [[UIView alloc] initWithFrame:tempLblFrame]; //Add label to UIView at 0,0 wrt to new UIView tempLblFrame.origin.x = 0; tempLblFrame.origin.y = 0; [_lblLongText setFrame:tempLblFrame]; [_lblLongText removeFromSuperview]; [lblView addSubview:_lblLongText]; //SetClipToBounds so that if label moves out of bounds of its superview, it wont be displayed [lblView setClipsToBounds:YES]; [lblView setBackgroundColor:[UIColor cyanColor]]; [self.view addSubview:lblView]; 

之后,我在模拟器上得到这个输出 – > 在这里输入图像说明

当我尝试使用此代码的animation时出现问题 –

  tempLblFrame.origin.x = -_lblLongText.intrinsicContentSize.width; [UIView animateWithDuration:2.0 delay:1.0 options:UIViewAnimationOptionCurveLinear animations:^{ [_lblLongText setFrame:tempLblFrame]; } completion:^(BOOL finished) { NSLog(@"completed"); }]; 

我希望能看到整个“非常长的文字”,而不是“非常…”从左到右滚动。

为了解决这个问题,我添加了一行代码 –

  //Add label to UIView at 0,0 wrt to new UIView tempLblFrame.origin.x = 0; tempLblFrame.origin.y = 0; tempLblFrame.size.width = _lblLongText.intrinsicContentSize.width; //THIS LINE WAS ADDED [_lblLongText setFrame:tempLblFrame]; [_lblLongText removeFromSuperview]; [lblView addSubview:_lblLongText]; 

我认为全文将被设置在新添加的UIView中,并且会正确滚动。 但在模拟器中运行给了我这个 –

在这里输入图像说明

再次,只有“非常…”从左到右滚动。

我究竟做错了什么? 请帮忙!!

编辑

显然,罪魁祸首是AutoLayout。

我不知道为什么,但是一旦我在XIB中取消选中“使用Autolayout”视图,一切都按预期开始工作。 设置tempLblFrame.origin.x = -_lblLongText.intrinsicContentSize.width; 工作正常,滚动也是如此。

对此有任何解释!!

这个问题可能是重复的 。

尽pipeCharles Powell为MarqueeLabel编写了一个很好的代码片段,

也看看这个链接 。

我希望这会帮助你,并通过提供所需的输出节省你的时间。

使UILabel是文本的宽度(或更长), UIView是要查看的滚动区域。 然后设置UIViewclipToBoundsYES (你正在做的)。 然后,当你从左向右animation时,你只会看到文本的UIView的宽度,因为它是削减任何额外的子视图。 只要确保你滚动UILabel的整个长度。

现在,您将视图和标签的高度和宽度设置为相同的东西。 这就是为什么你得到剪辑文本,而不是一个剪辑标签。

您添加在您的视图中滚动视图,并添加此标签在滚动视图。使用此代码

  scroll.contentSize =CGSizeMake(100 *[clubArray count],20); NSString *bname; bname=@""; for(int i = 0; i < [clubArray count]; i++) { bname = [NSString stringWithFormat:@"%@ %@ ,",bname,[[clubArray objectAtIndex:i] objectForKey:@"bottle_name"]]; [bname retain]; } UILabel *lbl1 = [[UILabel alloc] init]; [lbl1 setFrame:CGRectMake(0,5,[clubArray count]*100,20)]; lbl1.backgroundColor=[UIColor clearColor]; lbl1.textColor=[UIColor whiteColor]; lbl1.userInteractionEnabled=YES; [scroll addSubview:lbl1]; lbl1.text= bname; 

这是实现的代码。谢谢

显然,罪魁祸首是AutoLayout。

我不知道为什么,但是一旦我在XIB中取消选中“使用Autolayout”视图,一切都按预期开始工作。 设置tempLblFrame.origin.x = -_lblLongText.intrinsicContentSize.width; 工作正常,滚动也是如此。

不过,更好的解释,肯定会有所帮助!

编辑:与AutoLayout解决scheme –

  //Make UIView for Label to sit in CGRect tempLblFrame = _lblLongText.frame; UIView *lblView = [[UIView alloc] initWithFrame:tempLblFrame]; //#CHANGE 1 Removing all constraints [_lblLongText removeConstraints:_lblLongText.constraints]; //Add label to UIView at 0,0 wrt to new UIView tempLblFrame.origin.x = 0; tempLblFrame.origin.y = 0; //Set Full length of Label so that complete text shows (else only truncated text will scroll) tempLblFrame.size.width = _lblLongText.intrinsicContentSize.width; //#CHANGE 2 setting fresh constraints using the frame which was manually set [_lblLongText setTranslatesAutoresizingMaskIntoConstraints :YES]; [_lblLongText setFrame:tempLblFrame]; [_lblLongText removeFromSuperview]; [lblView addSubview:_lblLongText];