3

我在主视图中有一个带有文本的 UILabel - "Very Very long text"。正确的宽度是 142,但我已经将它缩短到 55。

基本上我想实现一个选取框类型的滚动,所以我编写了代码将它添加到子视图中并在该视图的范围内对其进行动画处理。

代码——

    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];

在此之后,我在模拟器上得到了这个输出——>在此处输入图像描述

当我使用此代码尝试动画时会出现问题 -

    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 中视图的“使用自动布局”,一切都开始按预期工作。设置 tempLblFrame.origin.x = -_lblLongText.intrinsicContentSize.width; 工作正常,卷轴也正常工作。

对此有何解释!!?

4

4 回答 4

5

这个问题可能是重复的

尽管 Charles Powell 为MarqueeLabel编写了很好的代码片段,

也看看这个链接

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

于 2013-06-26T05:44:02.123 回答
0

使UILabel文本的宽度(或更长)和UIView您想要查看的滚动区域。然后将UIView's设置clipToBoundsYES(您正在执行的操作)。然后,当您从左到右制作动画时,您只会看到宽度为 的文本UIView,因为它正在切割任何额外的子视图。只需确保滚动UILabel.

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

于 2013-06-25T12:52:23.557 回答
0

显然罪魁祸首是 AutoLayout。

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

尽管如此,对此的更好解释肯定会有所帮助!

编辑:使用自动布局的解决方案 -

    //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];
于 2013-06-26T05:20:17.390 回答
0

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

 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;

这是实现的代码。谢谢

于 2013-06-26T05:42:36.763 回答