1

我正在开发一个 iOS (6) 应用程序,我有一个视图,我改变了它的大小(动画),并且在那个视图中是一个 UILabel,我想随着视图一起增长,但不成比例。

即我需要视图占据,如果视图是特定大小的,比如说 90% 的视图,但是当我把它变大(到另一个特定大小)时,我只希望它占据,比如 80%。这是为了容纳 UILabel 周围的其他子视图,这些子视图将在超级视图增长时变得可见。

我已经尝试使用 NSLayoutContraints ,并将前导空间设置为它需要的空间,以及设置 UILabel 的宽度以使其适当增长,我还尝试设置前导和尾随空格(如然后宽度会自动增长)。

奇怪的是,我在同一个动画代码块中(使用 UIView animateWithDuration:...)有其他子视图,它们的 NSLayoutContraints 我正在玩,它们都可以工作。然而,所有这些都是间距限制,而不是大小限制,并且没有涉及 UILabel,所以我不知道这是否与它有关......

然后我尝试设置 UILabel 的 translatesAutoresizingMaskIntoConstraints = YES,并且只在标签上使用 setFrame:,虽然这将标签的大小和位置设置在我想要的位置,但更改没有动画,所以看起来很可怕......

有没有其他人有过这样的经历或任何想法来帮助我?

谢谢

以下是我一直在尝试的一些代码,其中“left”是标签的前导空间约束,“width”是标签的宽度约束。

setFrame 方法在父视图控制器的动画代码块中调用。

- (void)setFrame:(CGRect)frame {
    [super setFrame:frame];

    float gap = ((frame.size.height - 36) - 9 * [self.account.accountData numberOfBars]) / ([self.account.accountData numberOfBars] + 1);
    for (NSLayoutConstraint *constraint in constraints) {
        constraint.constant = gap;
    }

    self.left.constant = frame.size.width * 34/160 + (2 - 34 * 140 / 160);
    self.width.constant = frame.size.width * 0.575 + 55.5;

    [self layoutIfNeeded];

}
4

1 回答 1

1

您应该能够在代码中使用 constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant: 来做到这一点。一起使用乘数和常数应该可以工作。将标签的宽度设置为等于其父视图的宽度,但乘数为 0.7 或 0.8,然后是一个常数,可以在较小的视图尺寸下为您提供正确的宽度。随着视图的增长,该常数值将占总宽度的较小部分。例如,使用 0.7 的乘数和 20 的常数,如果超级视图为 100 点宽,则标签将为 90 点 (100*.7 +20)。如果视图增长到 200,标签将是 160 宽(或超级视图的 80%)。

编辑后:

实际上,我认为我上面提到的方法行不通。在 WWDC 2012 演讲“掌握自动布局的最佳实践”中,他们讨论了使用核心动画或直接为约束设置动画。我认为这是你必须做后者的情况。如果您使用核心动画,则标签会在视图动画时跳转到其新大小,即使两者都在动画块内(至少它对我来说是这样 - Rob,如果您知道得更好,请发布)。要直接为约束设置动画(在 IOS 中),您必须使用计时器,并增加约束常量。您可以使用 NSTimer,但由于其分辨率(50-100 毫秒)的限制,我发现它有点生涩。更流畅的方法是使用与显示刷新率相关的 CADisplayLink(我认为是 16.7 毫秒)。所以这是我使用的代码。我在 IB 中的设置是一个 190 宽的视图,里面有一个 170 宽的标签。我对两者都有宽度限制(您需要为此添加 QuartzCore 框架)。

#import "ViewController.h"
#import <QuartzCore/QuartzCore.h>

@interface ViewController ()
@property (strong,nonatomic) CADisplayLink *displayLink;
@end

@implementation ViewController {

    IBOutlet NSLayoutConstraint *labelWidthCon;
    IBOutlet NSLayoutConstraint *viewWidthCon;
}


-(IBAction)startViewTimer:(id)sender {
    [self startDisplayLink];
}

-(void)startDisplayLink {
    self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(expandView:)];
    [self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}

- (void)stopDisplayLink {
    [self.displayLink invalidate];
    self.displayLink = nil;
}


-(void)expandView:(CADisplayLink *) link {
    labelWidthCon.constant += 5;
    viewWidthCon.constant +=10;
    if (viewWidthCon.constant > 370) [self stopDisplayLink];
}
于 2013-02-10T01:07:28.280 回答