使用UILabel调整uiview并正确设置动画

时间:2012-09-07 06:25:01

标签: ios cocoa-touch uiview uiviewanimation

我有一个UIView作为容器,里面有一个UILabel:

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

现在我使用:

UIView animateWithDuration:animations:

并尝试将UIView(包含UILabel)的宽度设置为较小,然后在动画期间UILabel突然替换为“...”而没有平滑过渡到它。我将UILabel autoresizingmask设置为UIViewAutoresizingFlexibleWidth,UIViewAutoresizingFlexibleRightMargin将其保留,并将contentmode设置为left。

尝试其他内容模式,例如:缩放以填充,宽松适合,宽高比填充也无法解决我的问题,因为它们缩放文本然后看起来很奇怪。

任何人都知道如何为UILabel顺利过渡?

4 个答案:

答案 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()
        }
    }