2014-07-03 13 views
5

Ho una vista personalizzata che visualizza una UILabel nell'angolo in basso a destra. La vista è messa a punto in un metodo chiamato sia da initWithCoder: e initWithFrame: come questo:Arresto anomalo di Autolayout quando si applica la trasformazione: errore di asserzione 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]]; 

Ora, se lascio tutto come questo non ho alcun tipo di problema, ma, non appena ho applicare una trasformazione a questa etichetta (che è una sottoclasse di UILabel che è sufficiente aggiungere allineamento e bordi inserti verticali se quello che conta) l'applicazione si blocca con l'errore in console:

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

i suggerimenti affermazione che probabilmente la sottoclasse non ha chiamato [super layoutSubviews] quando sovrascrivendo il metodi ma l'ho fatto.

Poiché è chiaro che il problema qui è l'installazione di autolayout temo che mi stia trascurando qualcosa e forse il layout è ambiguo da qui il crash.

Un'altra nota: lo stesso codice non si arresta in modo anomalo su iOS 8 se si sposta la trasformazione nel metodo - (void)didMoveToSuperview.

Chiunque può aiutare qui?

risposta

3

In iOS7 è necessario eseguire questa operazione su viewDidAppear. Funzionerà anche per iOS8. Se non vuoi vedere la modifica dell'elemento ritardato sullo schermo, nascondi la tua super vista su viewDidLoad e visualizzala su viewDidAppear, subito dopo aver applicato le modifiche.

5

Ho riscontrato questo problema in iOS7 (ma non in iOS8) impedendo la regolazione dei vincoli in viewWillLayoutSubviews. Lo spostamento della regolazione dei vincoli su viewWillAppear lo ha risolto per me.