4

我有一个 UIView 作为容器,里面有一个 UILabel,如下所示:

-------------       ---------
|           |       |       |
|Label text |       |Label..|
|           |  -->  |       |
|           |       |       |
|           |       |       |
-------------       ---------

现在当我使用:

UIView animateWithDuration:animations:

并尝试将 UIView(包含 UILabel)的宽度设置为更小,然后在动画期间 UILabel 突然替换为“...”而没有平滑过渡。我将 UILabel 自动调整掩码设置为 UIViewAutoresizingFlexibleWidth、UIViewAutoresizingFlexibleRightMargin 以使其保持在左侧并将 contentmode 设置为左​​侧。

尝试其他内容模式,例如:缩放以填充,Aspect fit,Aspect fill 也不能解决我的问题,因为它们会缩放文本,然后看起来很奇怪。

有人知道如何为 UILabel 顺利过渡吗?

4

4 回答 4

5

前段时间我以所描述的方式为我的标签设置了动画,但你必须付出一些代价。基本思想: - 使用 clipsToBounds:YES 将标签添加到容器视图。- 不要为标签框架设置动画,而是为容器视图的框架设置动画,这样你的标签就会有一个平滑的过渡。- 为省略号 (...) 使用单独的标签,以便您也可以为这部分设置动画。

于 2012-09-07T06:51:04.407 回答
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;
    }
}
于 2012-09-07T06:58:06.733 回答
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;
    }
  }
}

希望这可以帮助某人。

于 2013-04-07T18:31:46.777 回答
0

老问题,但这对我有帮助:

    override var frame: CGRect {
        didSet {
            self.layoutSubviews()
        }
    }
于 2015-11-27T19:19:02.377 回答