从Anchor Constraints中读取CGFloat

时间:2017-10-21 15:19:17

标签: ios uiview anchor nslayoutconstraint cgfloat

我创建了一个UIView,然后添加了Anchor约束,但是当我想读取值时我遇到了问题......

在这种情况下,如你所见,我创建了一个NSLayoutConstraint属性来获取我的uiview的锚点宽度...然后我创建了一个包含约束的CGFloat但我的NSLog总是返回一个ZERO值。

我错在哪里?如何获取分配给锚点的UIView的宽度值?

 UIView *trackLine = [[UIView alloc] init];
    trackLine.backgroundColor = [self trackLineColor];
    trackLine.translatesAutoresizingMaskIntoConstraints = NO;
    [self addSubview:trackLine];

    [trackLine.topAnchor constraintEqualToAnchor:mediaTitle.bottomAnchor constant:25].active = YES;
    [trackLine.rightAnchor constraintEqualToAnchor:self.rightAnchor].active = YES;
    [trackLine.heightAnchor constraintEqualToConstant:1].active = YES;
    self.width = [trackLine.widthAnchor constraintEqualToAnchor:self.widthAnchor multiplier:.8];
    self.width.active = YES;

    CGFloat trackLineLenght =  self.width.constant;
   NSLog(@"TRACK LINE %f", trackLineLenght );

NSLog结果:

**2017-10-21 17:10:35.096562+0200  [5501:1994879] TRACK LINE 0.000000**

1 个答案:

答案 0 :(得分:1)

好的 - 有点困惑......

首先,不要使用“width”作为属性名称......非常混乱,因为宽度已经在很多地方使用过了。

所以,我们假设你有:

    @property NSLayoutConstraint *trackLineWidthConstraint;

.widthAnchor根据“锚的宽度是多少”实际上没有宽度。您定义约束的方式:

    self.trackLineWidthConstraint = [trackLine.widthAnchor constraintEqualToAnchor:self.widthAnchor multiplier:.8];

表示“将.trackLineWidthConstraint属性设置为self宽度的80%。因此,只要self的实际宽度发生变化,trackLine的实际宽度就会变宽视图将更改为新宽度的80%。

.constant为零。如果它不是零,那么在计算80%之后,该值将被添加。例如:

self.trackLineWidthConstraint = [trackLine.widthAnchor constraintEqualToAnchor:self.widthAnchor multiplier:.8];
// if self is 200-pts wide, trackLine will be 160-pts

self.trackLineWidthConstraint.constant = 10
// trackLine width is now (200 * 0.8) + 10, or 170-pts

如果您想获得trackLine的当前宽度,可以从.frame获取它(自动布局完成后)。

希望这不仅会让人感到更加困惑:)