2016-06-03 4 views
0

Ich bin dynamisch Hinzufügen von Subviews zu einem Superview während der Laufzeit und möchte die Größe der Superview auf die Unteransicht anpassen. Die Größenanpassung funktioniert einwandfrei, ist jedoch beim Hinzufügen der Unteransicht nicht zentriert. Die zweite Ansicht scheint hinzugefügt zu sein, wo die erste endete.Center NSView nach dem Hinzufügen zu Superview mit SetFrameOrigin in Swift unter OSX

Dies ist ein Stück Code, das mehrmals aufgerufen wird und verschiedene Subviews geben:

self.currentConstraints = [ 
     NSLayoutConstraint(item: superView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: subView.frame.size.height), 
     NSLayoutConstraint(item: superView, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: subView.frame.size.width) 
    ] 

    superView.addConstraints(self.currentConstraints!) 

    addChildViewController(viewController) 
    superView.addSubview(viewController.view) 

ich die Subview mit setFrameOrigin zu bewegen bekommen können, aber das bewegt sie beide nach oben oder unten, basierend auf dem Sie haben am Anfang falsch positioniert.

+0

Wenn Ihre Ansicht (en) am automatischen Layout teilnehmen (dh sie haben Einschränkungen), sollten Sie 'setFrameOrigin:' nicht aufrufen, um Dinge neu zu positionieren. Stattdessen sollten Sie Einschränkungen so einrichten, dass sie richtig ausgelegt sind. (Ich glaube nicht, dass es genug Informationen in Ihrer Frage gibt, um _exaktly_ zu wissen, was Sie zu tun versuchen und warum es nicht funktioniert.) –

+0

Ich stimme Andrew zu. Man kann Ihnen nicht wirklich helfen, da Sie nicht erwähnen, ob Sie Auto-Layout verwenden oder nicht. –

+0

Ist die bessere (mehr idiomatische) Art, Auto-Layout für diese Art von Sache zu verwenden? Ich benutze Auto-Layout (und verwende Einschränkungen, um die Größe zu ändern), also sollte ich vielleicht dabei bleiben? Obwohl, wenn es einen allgemeineren Weg gibt, der den Rahmen mehr umfasst, könnte ich beide Ansätze wechseln. – jake

Antwort

0

Ich endete Graben mit Einschränkungen und mit setFrameSize auf die Super-View. Diese Herangehensweise habe ich vorher übersprungen, weil das Popover, in dem es war, die Größe nicht änderte, also habe ich es einfach als Delegierten festgelegt und ließ es skalieren, wenn die neue Unteransicht hinzugefügt wurde.

superView.setFrameSize(subView.frame.size) 

    self.delegate.subViewChanged(subView.frame.size) 

    addChildViewController(viewController) 
    superView.addSubview(viewController.view) 
Verwandte Themen