【发布时间】:2013-06-25 12:05:03
【问题描述】:
我在主视图中有一个带有文本的 UILabel - “非常长的文本”。正确的宽度应该是 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;曾是 工作正常,卷轴也正常工作。
对此有何解释!!?
【问题讨论】:
-
为什么你不使用已经修复的开源控制? github.com/cbpowell/MarqueeLabel
-
首先我想自己尝试一些东西。其次,我必须对有很多标签的现有项目进行更改。我不想从每个 xib(iPad、iPhone)中删除每个标签,而是想尝试一种更省力的替代方法
标签: ios objective-c cocoa-touch uilabel