Hinweis für Googler: Diese Qualitätssicherung ist jetzt sechs Jahre veraltet !
Wie Micky unten und andere erwähnen, geschieht dies jetzt täglich mit Containern in iOS.
Ich habe einen ViewController, der viele Unteransichten steuert. Wenn ich auf eine der Schaltflächen klicke, initialisiere ich einen anderen Ansichtscontroller und zeige seine Ansicht als Unteransicht dieser Ansicht an. Die Unteransicht überschreitet jedoch die Grenzen des Rahmens für die Unteransicht und füllt den gesamten Bildschirm aus.
Was könnte falsch sein? Ich gehe davon aus, dass das Problem darin besteht, dass die Ansicht von UIViewController einen Rahmen (0,0,320,460) hat und somit den gesamten Bildschirm ausfüllt (obwohl Berührungsereignisse nur empfangen werden, wenn sie innerhalb der Rahmengrenzen der Unteransicht berührt werden). Wie kann ich die Größe des Rahmens so ändern, dass er als Unteransicht passt?
Kurz gesagt, ich benötige Hilfe beim Hinzufügen der Ansicht eines Viewcontrollers als Unteransicht zur Ansicht eines anderen Viewcontrollers.
Vielen Dank!
quelle
Antworten:
Ab iOS 5 können Sie mit Apple jetzt benutzerdefinierte Container erstellen , um einen UIViewController zu einem anderen UIViewController hinzuzufügen, insbesondere über Methoden wie addChildViewController, sodass UIViewController tatsächlich verschachtelt werden können
BEARBEITEN: Inklusive In-Place-Zusammenfassung, um Verbindungsbruch zu vermeiden
Ich zitiere:
...und:
Beispiel (mit freundlicher Genehmigung von Apple Docs) Hinzufügen der Ansicht eines anderen Ansichtscontrollers zur Ansichtshierarchie des Containers
- (void) displayContentController: (UIViewController*) content { [self addChildViewController:content]; content.view.frame = [self frameForContentController]; [self.view addSubview:self.currentClientView]; [content didMoveToParentViewController:self]; }
quelle
currentClientView
? Ich kann es in der Dokumentation überhaupt nicht verstehen.Dank dieser Jungs habe ich es geschafft http://highoncoding.com/Articles/848_Creating_iPad_Dashboard_Using_UIViewController_Containment.aspx
Fügen Sie UIView hinzu und verbinden Sie es mit dem Header:
@property (weak, nonatomic) IBOutlet UIView *addViewToAddPlot;
In - (void) viewDidLoad tun Sie Folgendes:
ViewControllerToAdd *nonSystemsController = [[ViewControllerToAdd alloc] initWithNibName:@"ViewControllerToAdd" bundle:nil]; nonSystemsController.view.frame = self.addViewToAddPlot.bounds; [self.addViewToAddPlot addSubview:nonSystemsController.view]; [self addChildViewController:nonSystemsController]; [nonSystemsController didMoveToParentViewController:self];
Genießen
quelle
Diese Antwort ist für alte Versionen von iOS korrekt, aber veraltet. Sie sollten die Antwort von Micky Duncan verwenden, die benutzerdefinierte Container abdeckt.
Tu das nicht! Die Absicht des
UIViewController
ist es, den gesamten Bildschirm zu steuern. Es ist einfach nicht dafür geeignet und es fügt nicht wirklich etwas hinzu, was Sie brauchen.Sie benötigen lediglich ein Objekt, dem Ihre benutzerdefinierte Ansicht gehört. Verwenden Sie einfach eine Unterklasse von
UIView
selbst, damit sie Ihrer Fensterhierarchie hinzugefügt werden kann und die Speicherverwaltung vollautomatisch erfolgt.Zeigen Sie dem Eigentümer der Unteransicht NIB auf eine benutzerdefinierte Unterklasse von
UIView
. Fügen SiecontentView
dieser benutzerdefinierten Unterklasse eine Steckdose hinzu und richten Sie sie auf die Ansicht innerhalb der Feder. Führen Sie in der benutzerdefinierten Unterklasse Folgendes aus:- (id)initWithFrame: (CGRect)inFrame; { if ( (self = [super initWithFrame: inFrame]) ) { [[NSBundle mainBundle] loadNibNamed: @"NibNameHere" owner: self options: nil]; contentView.size = inFrame.size; // do extra loading here [self addSubview: contentView]; } return self; } - (void)dealloc; { self.contentView = nil; // additional release here [super dealloc]; }
(Ich gehe davon aus, dass Sie hier
initWithFrame:
die Unteransicht erstellen.)quelle
Ich bin der Meinung, dass alle diese Antworten etwas unvollständig sind. Hier ist der richtige Weg, um die Ansicht eines viewControllers als Unteransicht einer anderen viewController-Ansicht hinzuzufügen:
[self addChildViewController:viewControllerToAdd]; [self.view addSubview:viewControllerToAdd.view]; [viewControllerToAdd didMoveToParentViewController:self];
Wenn Sie möchten, können Sie dies als Snippet in Ihren Code kopieren. SO scheint die Formatierung von Code-Ersetzungen nicht zu verstehen, aber sie werden in Xcode sauber angezeigt:
[self addChildViewController:<#viewControllerToAdd#>]; [self.view addSubview:<#viewControllerToAdd#>.view]; [<#viewControllerToAdd#> didMoveToParentViewController:self];
wird sich bewegen wird automatisch mit addChild aufgerufen. Danke @iOSSergey
quelle
Verwenden:
[self.view addSubview:obj.view];
quelle
Ändern Sie die Rahmengröße von
viewcontroller.view.frame
und fügen Sie sie dann zur Unteransicht hinzu.[viewcontrollerparent.view addSubview:viewcontroller.view]
quelle
Sie müssen die Begrenzungseigenschaften so einstellen, dass sie zu diesem Rahmen passen. Rahmen seine Übersichtseigenschaften, und Grenzen begrenzen den Rahmen im Koordinatensystem der Ansicht selbst.
quelle
Sie können PopupController für dasselbe SDK verwenden, das UIViewController als Unteransicht anzeigt. Sie können PopupController überprüfen
Hier ist ein Beispielcode dafür
popup = PopupController .create(self.navigationController!) .customize( [ .layout(.center), .animation(.fadeIn), .backgroundStyle(.blackFilter(alpha: 0.8)), .dismissWhenTaps(true), .scrollable(true) ] ) .didShowHandler { popup in } .didCloseHandler { popup in } let container = MTMPlayerAndCardSelectionVC.instance() container.closeHandler = {() in self.popup.dismiss() } popup.show(container)
quelle