2013-06-15 5 views
10

Ich habe eine benutzerdefinierte Ansicht in einer NIB-Datei definiert und möchte eine Kopie in einem StoryBoard instanziieren, aber ich habe Probleme mit dem automatischen Layout.Probleme mit AutoLayout mit benutzerdefinierten Ansichten in NIB-Datei definiert und in StoryBoard verwendet

In einem einfachen Beispiel verfügt die benutzerdefinierte Ansicht über ein einzelnes Label mit einer festen Größe, das sowohl vertikal als auch horizontal zentriert ist. Alle verwenden das automatische Layout.

enter image description here

Der Dateieigentümer meiner Klasse festgelegt ist, hat es einen Zugang zum Draufsicht. Bei der Umsetzung benutzerdefinierte Ansicht ich tue:

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

Nun, in meinem Drehbuch, ich UIView hinzuzufügen, setzt es ist Klasse meiner benutzerdefinierten Klasse und Layout aus Größe und mittig auf meiner Seite, wieder automatisches Layout verwenden.

enter image description here

Und ist mein Widget und Größe richtig positioniert ist, aber es ist Inhalt nicht wie unten dargestellt geändert wird: enter image description here

Ich habe versucht, mehr Einschränkungen Zugabe nach der entlang der Linien von der NIB, etwas Laden:

Dies führt jedoch zu ungültigen Layouteinschränkungen.

Irgendwelche Ideen, wie man das zum Laufen bringt?

Prost!

+0

denke, ich habe warum gefunden: die Sicht aus dem Laden der NIB muss angewiesen werden, die automatische Größenänderungsmaske nicht in Constraints zu konvertieren, * EVEN * wenn der Inhalt der NIB tatsächlich mit aktiviertem Auto-Layout erstellt wird. Also nach dem Laden der NIB und vor dem Hinzufügen der Draufsicht auf die benutzerdefinierte Ansicht, muss ich anrufen: '[self.topView setTranslatesAutoresizingMaskIntoConstraints: NEIN];' – mkrus

+0

Sie können die richtige Antwort hier finden: http://StackOverflow.com/a/34524346/971329. Siehe meinen Kommentar unten für die Swift-Implementierung eines wiederverwendbaren Superview, der sich um all das kümmert. – blackjacx

Antwort

20

Die Ansicht, die beim Laden der NIB erstellt wird, muss angewiesen werden, die automatische Größenänderungsmaske nicht in Constraints zu konvertieren, selbst wenn der Inhalt der NIB tatsächlich mit aktiviertem Auto-Layout erstellt wird.

So nach dem NIB Laden und bevor es Draufsicht auf die benutzerdefinierte Ansicht hinzufügen, muss ich nennen:

[self.topView setTranslatesAutoresizingMaskIntoConstraints:NO]; 
+3

Während dies funktioniert, wird es allgemein als beste Vorgehensweise akzeptiert, stattdessen die Klassenmethode zu überschreiben, d.h.'+ (BOOL) translateAutoresizingMaskIntoConstraints {return YES;}' – Ash

0

Deaktivieren „Use Größenklassen“ für mich gearbeitet. Ich musste nicht tun, was mkrus erwähnt hat.

+0

Ich habe es versucht, aber es funktioniert nicht. –

1

Zusätzlich zu dem, was mkrus oben schon sagt, ist es das, was meine initWithCoder:

- (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; 
    } 

Der Grund für diese initWithCoder: Ansatz erklärt here wie für die benutzerdefinierte Klasse Spitze aussieht. Ich habe die Auto-Layout-Einschränkungen für Mauerwerk hinzugefügt, so dass es mit den in Interface Builder definierten Einschränkungen funktioniert.

Verwandte Themen