2017-10-21 118 views
0

J'ai créé un UIView puis ajouter les contraintes d'ancrage mais j'ai un problème quand je veux lire les valeurs ...Lire CGFloat de Anchor Contraintes

Dans ce cas, comme vous le voyez, je créé une propriété à NSLayoutConstraint obtenir la largeur d'ancre de mon uiview ... J'ai alors créé un CGFloat qui contient une contrainte mais mon NSLog me renvoie toujours une valeur ZERO.

Où est-ce que je me trompe? comment puis-je obtenir les valeurs de largeur de mon UIView attribué aux ancres?

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 Résultat:

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

Quelle est la valeur de 'self.widthAnchor' à ce moment-là? Est-il possible que 'self' n'ait pas de taille intrinsèque, et que son cadre n'ait pas encore été défini? – DonMag

+0

@DonMag En quelques mots, j'essayais de suivre ce tutoriel en utilisant uiview au lieu de CALayer mais je reçois toujours les mauvaises valeurs et je ne sais pas pourquoi https://www.raywenderlich.com/36288/how-to-make- a-custom-control – kAiN

+0

OK ... alors ... comme je l'ai demandé dans mon premier commentaire ... * Quelle est la valeur de 'self.widthAnchor' à ce moment-là? * – DonMag

Répondre

1

OK - un peu de confusion ...

D'abord, ne pas utiliser de "largeur" ​​comme nom de la propriété ... très déroutant, puisque la largeur est déjà utilisé dans de nombreux endroits.

Ainsi, supposons que vous avez:

@property NSLayoutConstraint *trackLineWidthConstraint; 

A .widthAnchor n'a pas vraiment une largeur en termes de « ce qui est la largeur de l'ancre. » La façon dont vous définissez vos contraintes:

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

dit « définir la .trackLineWidthConstraint propriété à 80% de la largeur de self Ainsi, chaque fois que la largeur réelle de self changements, la largeur réelle de votre point de vue trackLine va changer pour. .. 80% de la nouvelle largeur

le .constant est zéro si elle était autre chose que zéro, cette valeur serait ajoutée après calcul 80% par exemple.

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 

Si vous voulez obtenir l'actuel largeur de trackLine, vous pouvez l'obtenir à partir de .frame (après la mise en page automatique est terminée).

Espérons que cela n'a pas seulement le rendre plus confus :)

+0

ok mais comment puis-je obtenir le cadre après la mise en page automatique? pourquoi quand j'appelle view.frame.size.width ne me donne jamais une valeur ... ai-je tort à l'endroit où j'appelle le cadre? – kAiN

+0

Aussi je voulais demander pourquoi dans la propriété vous n'avez pas ajouté (nonatomic, fort) ??? – kAiN

+0

si nous pouvons aller 2 minutes de discussion, je verrai mon code pour comprendre pourquoi mon curseur ne répond pas ... Je vais sortir de mon esprit – kAiN