2014-07-03 7 views
5

Ich habe eine benutzerdefinierte Ansicht, die ein UILabel in der rechten unteren Ecke anzeigen. Die Ansicht ist Setup in einem Verfahren von beiden initWithCoder: und initWithFrame: wie folgt aufgerufen:Auto-Layout-Absturz beim Anwenden der Transformation: Assertionsfehler in - [layoutSublayersOfLayer:]

MCLabel* likesLabel = [[MCLabel alloc] init]; 
likesLabel.mc_textPadding = UIEdgeInsetsMake(0, 10, 0, 10); 
likesLabel.font = [UIFont fontWithName:@"FontAwesome" size:12.f]; 
[likesLabel setText:@"test"]; 
likesLabel.numberOfLines = 2; 
likesLabel.backgroundColor = [UIColor colorWithWhite:1 alpha:.8]; 
likesLabel.textColor = UIColor.blackColor; 
likesLabel.translatesAutoresizingMaskIntoConstraints = NO; 
likesLabel.textAlignment = NSTextAlignmentCenter; 
likesLabel.mc_verticalTextAlignment = MCVerticalTextAlignmentTop; 

[self addSubview:likesLabel]; 
self.likesLabel = likesLabel; 

NSLayoutConstraint* widthConstraint = [NSLayoutConstraint constraintWithItem:likesLabel attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeWidth multiplier:1 constant:1]; 
NSLayoutConstraint* heightConstraint = [NSLayoutConstraint constraintWithItem:likesLabel attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:likesLabel attribute:NSLayoutAttributeWidth multiplier:2/5.f constant:1]; 
NSLayoutConstraint* horizontalPosition = [NSLayoutConstraint constraintWithItem:likesLabel attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeRight multiplier:1 constant:1]; 
NSLayoutConstraint* verticalPosition = [NSLayoutConstraint constraintWithItem:likesLabel attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeBottom multiplier:1 constant:1]; 
[likesLabel addConstraints:@[heightConstraint]]; 
[self addConstraints:@[widthConstraint, horizontalPosition, verticalPosition]]; 

Wenn ich nun alles wie dies lasse ich habe keine Art von Problem, aber sobald ich eine Transformation auf dieses Label anwenden (das ist eine Unterklasse von UILabel, dass einfach die vertikale Ausrichtung und Randeinsätze hinzufügen, wenn diese Fragen) die App-Abstürze mit dem Fehler in der Konsole:

*** Assertion failure in -[MCView layoutSublayersOfLayer:], /SourceCache/UIKit/UIKit-2935.138/UIView.m:8794 
Auto Layout still required after executing -layoutSubviews 

die Behauptung Hinweise, die wahrscheinlich die Unterklasse nicht [super layoutSubviews] haben aufrufen, wenn die zwingende Methoden, aber ich habe es getan.

Da ist klar, dass das Problem hier ist das automatische Layout-Setup Ich habe Angst, dass ich etwas übersehen und vielleicht ist das Layout mehrdeutig daher der Absturz.

Noch ein Hinweis: Derselbe Code stürzt nicht auf iOS 8 ab, wenn ich die Transformation in der Methode verschiebe.

Wer kann hier helfen?

Antwort

3

In iOS7 müssen Sie dies auf ViewDidAppear tun. Es funktioniert auch für iOS8. Wenn Sie nicht möchten, dass die verzögerte Elementänderung auf dem Bildschirm angezeigt wird, verstecken Sie Ihre Superansicht in viewDidLoad und blenden Sie sie in viewDidAppear ein, direkt nachdem Sie Ihre Änderungen übernommen haben.

5

Ich hatte dieses Problem in iOS7 (aber nicht iOS8) von Constraint-Anpassungen in viewWillLayoutSubviews setzen. Verschieben Constraint-Anpassung an viewWillAppear repariert es für mich.

Verwandte Themen