我有一个UIView作为容器,里面有一个UILabel:
------------- ---------
| | | |
|Label text | |Label..|
| | --> | |
| | | |
| | | |
------------- ---------
现在我使用:
UIView animateWithDuration:animations:
并尝试将UIView(包含UILabel)的宽度设置为较小,然后在动画期间UILabel突然替换为“...”而没有平滑过渡到它。我将UILabel autoresizingmask设置为UIViewAutoresizingFlexibleWidth,UIViewAutoresizingFlexibleRightMargin将其保留,并将contentmode设置为left。
尝试其他内容模式,例如:缩放以填充,宽松适合,宽高比填充也无法解决我的问题,因为它们缩放文本然后看起来很奇怪。
任何人都知道如何为UILabel顺利过渡?
答案 0 :(得分:5)
前段时间我用标签描述了我的标签,但是你必须付出一些代价。 基本理念: - 使用clipsToBounds将标签添加到containerview:YES。 - 不要为标签框架设置动画,而是为容器视图的框架设置动画,这样您的标签就会平滑过渡。 - 为Elipsis(...)使用单独的标签,以便您也可以为此部分设置动画。
答案 1 :(得分:0)
不幸的是标签没有缩放;更改它的框架会更改文本的放置位置,但文本的大小不会以这种方式缩放。所以基本的动画就出来了,另一种方法是在计时器每次开机时启动一个定时器,将定时器的帧缩小预定量。
当然,您需要将标签setAdjustsFontSizeToFitWidth
属性设置为YES
。
注意:如果可能的话,请避免每隔5/1000秒实际触发一次计时器。
- (void)fireTimer
{
timer = [NSTimer scheduledTimerWithTimeInterval:0.005 target:self selector:@selector(animate) userInfo:nil repeats:YES];
}
- (void)animate
{
[label setAdjustsFontSizeToFitWidth:YES];
if (label.frame.size.width > 100) {
[label setFrame:CGRectMake(label.frame.origin.x, label.frame.origin.y, label.frame.size.width-1, label.frame.size.height)];
}else{
[timer invalidate];
timer = nil;
}
}
答案 2 :(得分:0)
在自动旋转期间调整UILabel大小时遇到类似问题,并使用CADisplayLink解决了这个问题。
首先,在willAnimateRotationToInterfaceOrientation方法中调用displayLinkTimer。
displayLinkTimer = [CADisplayLink displayLinkWithTarget:self selector:@selector(resizeTextLabel)];
[displayLinkTimer addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
然后,通过调整大小来调整标签的大小,使其与我创建的名为textView的不可见UIView的速率相同。 textView的框架与我想要的UILabel框架相同,并且在willAnimateRotationToInterfaceOrientation方法中更改了它的大小。通过访问textView的presentationLayer,我能够以相同的速率调整大小。
- (void)resizeTextLabel{
if (UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)) {
if (textLabel.frame.size.width < textView.frame.size.width -20) {
textLabel.frame = CGRectMake(0, 0, [[textView.layer presentationLayer] frame].size.width, [[textView.layer presentationLayer] frame].size.height);
}else{
[timer invalidate];
timer = nil;
}
}
else{
if (textLabel.frame.size.width > textView.frame.size.width -20) {
textLabel.frame = CGRectMake(0, 0, [[textView.layer presentationLayer] frame].size.width, [[textView.layer presentationLayer] frame].size.height);
}else{
[timer invalidate];
timer = nil;
}
}
}
希望这有助于某人。
答案 3 :(得分:0)
老问题,但这对我有所帮助:
override var frame: CGRect {
didSet {
self.layoutSubviews()
}
}