web-dev-qa-db-ger.com

So fügen Sie eine ViewController-Ansicht als Unteransicht hinzu

Hinweis für Googler, dieses Q-A ist jetzt seit sechs Jahren nicht mehr aktuell !

Wie Micky unten und andere erwähnen, geschieht dies jetzt täglich mit Containers in iOS.


Ich habe einen ViewController, der viele Unteransichten steuert. Wenn ich auf eine der Schaltflächen klicke, initialisiere ich einen anderen Viewcontroller und zeige dessen Ansicht als Unteransicht dieser Ansicht. 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 nehme an, das Problem ist, dass die Ansicht von UIViewController einen Frame (0,0,320,460) hat und somit den gesamten Bildschirm ausfüllt (obwohl sie Berührungsereignisse nur empfängt, wenn sie innerhalb der Frame-Grenzen der Subansicht berührt werden). Wie kann ich die Größe des Rahmens ändern, um als Unteransicht zu passen?.

Kurz gesagt, ich brauche Hilfe, um die Ansicht eines Viewcontrollers als Unteransicht zur Ansicht eines anderen Viewcontrollers hinzuzufügen.

Vielen Dank!

73
sperumal

Ab iOS 5 können Sie jetzt benutzerdefinierte Container erstellen, um einen UIViewController zu einem anderen UIViewController hinzuzufügen, insbesondere über Methoden wie addChildViewController so UIViewControllers können auch verschachtelt werden

EDIT: Integrierte Zusammenfassung, um einen Link-Bruch zu vermeiden

Ich zitiere:

iOS bietet viele Standardcontainer, um Sie beim Organisieren Ihrer Apps zu unterstützen. Manchmal müssen Sie jedoch einen benutzerdefinierten Workflow erstellen, der nicht mit dem Systemcontainer der Systemcontainer übereinstimmt. In Ihrer Vision ist für Ihre App möglicherweise eine bestimmte Organisation erforderlich child view controller mit speziellen Navigationsgesten oder Animationsübergängen zwischen ihnen Um dies zu implementieren, implementieren Sie einen benutzerdefinierten Container - Weitere Informationen ...

...und:

Wenn Sie einen Container entwerfen, erstellen Sie explizite Parent-Child-Beziehungen zwischen Ihrem Container, dem Parent und anderen View-Controllern und deren untergeordneten Elementen. - Weitere Informationen

Beispiel (mit freundlicher Genehmigung von Apple-Dokumenten) 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];          
}

Prost,

Micky Duncan

86
MickyD

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 dies:

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

41
Naloiko Eugene

Diese Antwort ist für alte Versionen von iOS korrekt, aber jetzt veraltet. Sie sollten die Antwort von Micky Duncan verwenden, die benutzerdefinierte Container abdeckt.

Tu das nicht! Die UIViewController beabsichtigt, den gesamten Bildschirm zu steuern. Es ist einfach nicht dafür geeignet und fügt nicht wirklich alles hinzu, was Sie brauchen.

Sie benötigen lediglich ein Objekt, das Ihre benutzerdefinierte Ansicht besitzt. Verwenden Sie einfach eine Unterklasse von UIView selbst, damit diese zur Fensterhierarchie hinzugefügt werden kann und die Speicherverwaltung vollautomatisch ist.

Verweisen Sie auf den Besitzer der Unteransicht NIB eine benutzerdefinierte Unterklasse von UIView. Fügen Sie dieser benutzerdefinierten Unterklasse einen contentView-Auslass hinzu und richten Sie ihn auf die Ansicht in der Spitze. 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: verwenden, um die Unteransicht zu erstellen.)

26
Steven Fisher

Ich habe das Gefühl, dass alle diese Antworten etwas unvollständig sind. Daher können Sie die Ansicht eines ViewControllers als Unteransicht der Ansicht eines anderen ViewControllers hinzufü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 Code-Ersetzungsformatierung nicht zu verstehen, aber sie werden in Xcode sauber angezeigt:

    [self addChildViewController:<#viewControllerToAdd#>];
    [self.view addSubview:<#viewControllerToAdd#>.view];
    [<#viewControllerToAdd#> didMoveToParentViewController:self];

willMove wird automatisch mit addChild aufgerufen. Danke @iOSSergey

Wenn Ihr benutzerdefinierter Container die addChildViewController: -Methode aufruft, ruft er automatisch die willMoveToParentViewController: -Methode des View-Controllers auf, die vor dem Hinzufügen als untergeordnetes Element hinzugefügt wird.

16
Logan

Benutzen:

[self.view addSubview:obj.view];
6
rahul gupta

Ändern Sie die Bildgröße von viewcontroller.view.frame und fügen Sie sie zur Unteransicht hinzu. [viewcontrollerparent.view addSubview:viewcontroller.view]

1
CiNN

Sie können PopupController für dasselbe verwendenEines SDK, das UIViewController als Unteransicht anzeigt Sie können PopupController überprüfen.

Hier ist Beispielcode für das gleiche

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)
0
Anjali jariwala

Sie müssen die Begrenzungseigenschaften auf diesen Rahmen einstellen. Rahmen seine Superview-Eigenschaften und Grenzen begrenzen den Rahmen im Koordinatensystem der Ansicht selbst.

0
bolek