2014-02-26 12 views
5

Ich habe Probleme, meine Subviews korrekt mit Auto-Layout zu skalieren. Um meinen Standpunkt zu verdeutlichen, habe ich ein minimalistisches Beispiel zusammengestellt.Cocoa Autolayout und Größenanpassung von Subviews

Zuerst habe ich einen neuen NSViewController erstellt und eine Unteransicht hinzugefügt (in diesem speziellen Fall eine NSTextView) und Autolayout-Einschränkungen hinzugefügt.

enter image description here

Ich habe dann eine benutzerdefinierte Ansicht meiner MainMenu.xib und auch für die Automatische Anordnung Einschränkungen einrichten.

enter image description here

Schließlich habe ich eine Instanz meiner Ansicht-Controller und legte seine Ansicht in meiner benutzerdefinierten Ansicht.

#import "AppDelegate.h" 
#import "MyViewController.h" 

@interface AppDelegate() 
@property (weak) IBOutlet NSView *customView; 
@end 

@implementation AppDelegate 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 

    [self.customView addSubview:myViewController.view]; 
    myViewController.view.frame = self.customView.bounds; 
} 

@end 

Seit „Autoresizes Subviews“ in beiden xib Dateien aktiviert ist, würde ich die NSTextView, um die Größe zu erwarten, wenn ich das Hauptfenster ändern. Es bleibt jedoch einfach an Ort und Stelle. hier

enter image description here

Was bin ich? Das hat mich seit ein paar Tagen verwirrt.

Danke, Michael Knudsen

Antwort

3

Ihre NSTextView die enthält Ansicht hat keine Einschränkungen ihrer Eltern, in diesem Fall dem Fenster. Die von Ihnen hinzugefügte Ansicht wird nicht in der Größe geändert, da Ihre Ansicht nicht über Abhängigkeiten mit dem übergeordneten Element verbunden ist. Möglicherweise möchten Sie die Methode addConstraint: untersuchen, wenn Sie dies programmgesteuert durchführen möchten.

Weitere Informationen finden Sie unter Apple's docs.

+0

Wenn Sie bei der ersten Screenshot in meinem Beitrag sehen, scheint es, dass die NSTextView (oder genauer gesagt die NSScrollView in denen sie eingebettet sind) ist eine Unteransicht der IBOutlet Ansicht meiner Ansicht-Controller. Die Einschränkungen bezüglich der automatischen Auslagerung beziehen sich auf diese Ansicht, richtig? –

+0

Ich habe tatsächlich damit experimentiert, es programmatisch zu machen, aber irgendwie hat mich das daran gehindert, irgendetwas zu verändern. Es war einfach nicht möglich, die Fensterecken/Seiten zu "greifen", nachdem eine Ansicht programmatisch hinzugefügt wurde. Rate mal, es ist Zeit, zu der Dokumentation zurückzukehren und es noch einmal zu versuchen. –

+0

Ja, die automatischen Layouteinschränkungen beziehen sich auf die * Ansicht * (dh die übergeordnete Ansicht) der Textansicht. – SevenBits

8

Nur für den Fall, dass jemand in das gleiche Problem läuft. Ich habe es auf diese Weise gelöst (dank @SevenBits, dass er mich in diese Richtung gelenkt hat).

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 

    [self.customView addSubview:myViewController.view]; 

    myViewController.view.translatesAutoresizingMaskIntoConstraints = NO; 

    NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[subView]|" 
                      options:0 
                      metrics:nil 
                      views:@{@"subView" : myViewController.view}]; 

    NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[subView]|" 
                      options:0 
                      metrics:nil 
                      views:@{@"subView" : myViewController.view}]; 

    [self.customView addConstraints:verticalConstraints]; 
    [self.customView addConstraints:horizontalConstraints]; 
} 
+1

Brilliant. Dies sollte die akzeptierte Antwort sein. – RajV

Verwandte Themen