2014-07-03 21 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.

Problemi correlati