2013-06-15 12 views
10

Ho definito una vista personalizzata in un file NIB e vorrei creare un'istanza di una copia in uno StoryBoard ma ho problemi con l'autolayout.Problemi con AutoLayout con viste personalizzate definite nel file NIB e utilizzate in StoryBoard

In un semplice esempio, la vista personalizzata ha un'etichetta singola con una dimensione fissa e centrata sia verticalmente che orizzontalmente, il tutto utilizzando l'autolayout.

enter image description here

Il proprietario del file è impostato per la mia classe, ha una presa di corrente per la vista dall'alto. Nell'implementazione visualizzazione personalizzata che faccio:

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if(self) 
    { 
     [[NSBundle mainBundle] loadNibNamed:@"FMCompassView" owner:self options:nil]; 
     [self addSubview:self.topView]; 
    } 
    return self; 
} 

Ora, nel mio storyboard, aggiungo un UIView, impostato è di classe alla mia classe personalizzata e layout fuori dimensioni e centrato sulla mia pagina, sempre utilizzando autolayout.

enter image description here

E il mio widget viene posizionato e il formato, ma il suo contenuto non viene ridimensionato come illustrato di seguito: enter image description here

Ho provato ad aggiungere più vincoli dopo aver caricato dalla NIB, qualcosa sulla falsariga di:

UIView* subV = self.topView; 
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(subV); 
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[subV]|" options:NSLayoutFormatAlignAllBaseline metrics:nil views:viewsDictionary]]; 
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[subV]|" options:NSLayoutFormatAlignAllBaseline metrics:nil views:viewsDictionary]]; 

Ma questo causa vincoli di layout non validi.

Qualche idea su come farlo funzionare?

Cheers!

+0

penso di aver trovato il motivo: la vista creata dal caricamento del NIB deve essere detta di non convertire la maschera di ridimensionamento automatico in vincoli, * EVEN * se il contenuto del NIB viene effettivamente creato con l'autolayout abilitato. Quindi dopo aver caricato il NIB e prima di aggiungere la vista superiore alla vista personalizzata, devo chiamare: '[self.topView setTranslatesAutoresizingMaskIntoConstraints: NO];' – mkrus

+0

Puoi trovare la risposta corretta qui: http://stackoverflow.com/a/34524346/971329. Vedi il mio commento qui sotto per l'implementazione rapida di una superview riutilizzabile che si prende cura di tutte le cose. – blackjacx

risposta

20

La vista creata dal caricamento del NIB deve essere detta di non convertire la maschera di ridimensionamento automatico in vincoli, ANCHE se il contenuto del NIB viene effettivamente creato con l'esecuzione automatica attivata.

Così, dopo aver caricato il NIB e prima di aggiungere è vista dall'alto per la visualizzazione personalizzata, ho bisogno di chiamare:

[self.topView setTranslatesAutoresizingMaskIntoConstraints:NO]; 
+3

Anche se funzionerà, è generalmente accettato come metodo migliore per sostituire il metodo di classe, ad es.'+ (BOOL) traduceAutoresizingMaskIntoConstraints {return YES;}' – Ash

0

Disattivazione "Usa classi dimensionali" ha lavorato per me. Non dovevo fare quello che mkrus ha menzionato.

+0

ho provato a farlo ma non funziona. –

1

In aggiunta a quanto mkrus suggerisce sopra, questo è ciò che il mio initWithCoder: sembra che per il pennino classe personalizzata:

- (instancetype)initWithCoder:(NSCoder *)aDecoder 
    { 
     self = [super initWithCoder:aDecoder]; 
     if (self) { 
      NSString *className = NSStringFromClass([self class]); 
      self.view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject]; 
      [self.view setTranslatesAutoresizingMaskIntoConstraints:NO]; 
      [self addSubview:self.view]; 
      [self.view mas_makeConstraints:^(MASConstraintMaker *make) { 
       make.edges.equalTo(self); 
      }]; 
     } 
     return self; 
    } 

La ragione di questo initWithCoder: approccio è spiegato here. Ho aggiunto i vincoli del layout automatico della Massoneria in modo che funzioni con i vincoli definiti nel generatore di interfacce.

Problemi correlati