UIView addsubview nach der Ausrichtung ändern: Sagen Sie Ansicht, um die Größe
Ich habe eine UIView eine XIB-in den Portrait-Modus.
Diese Ansicht programmgesteuert Hinzugefügt, um die viewcontroller wie diese:
NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"InputView" owner:self options:nil];
InputView *inputView = (InputView*)[nibObjects objectAtIndex:0];
[self.view addSubview:inputView];
Diese Ansicht hat autoresizing Masken richtig eingestellt, und dreht fein, wenn sich die Ausrichtung ändert sich von Porträt zu Landschaft.
Jedoch, wenn die Orientierung ist bereits Landschaft und ich eine Ansicht erstellen nach die änderung der Ausrichtung, es hat seine ursprüngliche hochformat.
Gibt es eine Möglichkeit zu sagen, die Ansicht zu initialisieren oder ändern Sie die Größe selbst-Porträt, indem es seine Masken?
Vielen Dank im Voraus für jede Antwort!
BEARBEITEN:
Über die Vorschläge von occulus und Inder Kumar Rathore (danke Jungs!), Ich veränderte den code zu diesem:
InputView *inputView = (InputView*)[nibObjects objectAtIndex:0];
[self.view addSubview:inputView];
[self.view setNeedsLayout];
[self.view layoutSubviews];
[self.view layoutIfNeeded];
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
[self shouldAutorotateToInterfaceOrientation:orientation];
Leider gibt es überhaupt keine Veränderung.
Ich denke, dass ich jemanden gefunden, Fragen sich die gleiche Frage:
Beim hinzufügen eines sub-Ansicht in der Ansicht nicht verkleinern, wenn die app im landscape-Modus
Die Antwort das problem identifiziert, korrekt, aber nicht sehr ermutigend...
Sicher, ich könnte zwei Kerne oder die Größe des Rahmens ändern, aber das scheint so im Widerspruch zu der Idee des auto-Größenänderung.
Ich finde es schwer zu glauben, dass es keine Möglichkeit zu sagen, eine Feder nach dem Erwachen und hinzufügen zu einer Ansicht mit seinen autoresize Funktionen...etwas, das einwandfrei arbeitet, wenn das Gerät dreht.
EDIT 2:
Die Lösung des idz arbeitet:
InputView *inputView = (InputView*)[nibObjects objectAtIndex:0];
[self.view addSubview:inputView];
inputView.frame = self.view.bounds;
[inputView show];
Dank!
- Ich hatte dieses problem, mit zwei Falten: (1) ich war mit einem kontrollierten Blick, der nib geladen UIVC; & (2) es zeigte nur unter iOS 4.3 nicht 5.0. yasirmturk Methode fixiert es für mich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Oft eine NIB/XIB-Datei enthält eine
UIViewController
kümmert all dies. In diesem Fall, da Ihr keine view-controller (in der NIB/XIB), die Sie benötigen, um über seine post-load-Aufgaben.Aufrufen
layoutSubviews
direkt, oder indirekt übersetNeedsLayout
oderlayoutIfNeeded
nicht tun Sie viel gutes, da die Standardimplementierung tut nichts.Angenommen, Sie wollen input view zu füllen, die Grenzen des selbst.Ansicht Sie Folgendes tun:
Alle Masken Größe der sub-Ansichten muss korrekt eingestellt sein für diese zu arbeiten und, natürlich, wenn Sie nicht wollen, füllen Sie die vollständigen Grenzen, die Sie vielleicht anpassen möchten den Rahmen.
Dies funktioniert für mich (Y)
Ich weiß nicht, ob Sie noch dieses Problem.
Lassen Sie uns sagen, Sie haben die folgende Architektur:
(Sie umgesetzt shouldautorotate richtige Beantwortung der wollte Orientierungen)
In diesem subviewcontroller Sie hinzufügen wollen, den Blick auf neue UIViewControllers nur durch den Aufruf der
addSubview
Funktion.Nicht umsetzen, sondern die Grenzen der manipulation in shouldautorotate, sollten Sie implementieren es in
didRotateFromInterface
... aufgerufen wird, nachdemshouldRotate
. In dieser Funktion werden die Grenzen sind bereits richtig eingestellt.Diese Weise brauchen Sie nicht so viel manipulation von code.
Siehe in diesem Zusammenhang die Frage:
Wenn autoresizing Masken wirksam in iOS?
So, nach dem laden Ihre neue Ansicht aus der Feder, und das hinzufügen als eine Untersicht auf
self.view
ist, versuchen Sie den AufrufsetNeedsLayout
.