UIScrollView mit aktivierten Seiten und Änderungen der Gerätedrehung / Ausrichtung (MADNESS)
Ich bin eine harte Zeit haben, dieses Recht.
Habe ich eine UIScrollView, mit paging aktiviert. Es wird geführt von einem view controller (MainViewController) und jede Seite wird verwaltet von einem PageViewController, seine Ansicht als unteransicht der scrollView am entsprechenden offset. - Bildlauf nach Links und rechts für standard-Orientierung iPhone-app. Funktioniert gut. Im Grunde genau wie das Beispiel von Apple und wie auch das Wetter-app mit dem iPhone.
Jedoch, wenn ich versuche, Unterstützung von anderen Orientierungen, Dinge, die nicht sehr gut funktionieren. Ich habe unterstützt jede Orientierung in beiden MainViewController und PageViewController mit dieser Methode:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return YES;
}
Allerdings, wenn ich drehen Sie das Gerät, meine Seiten werden ziemlich verzerrt, und es gibt eine Menge von Zeichnung Pannen, vor allem, wenn nur einige der Seiten wurden geladen, dann habe ich drehen, dann scrollen mehr, etc... Sehr chaotisch.
Ich habe gesagt, dass meine Ansichten zur Unterstützung von auto-Größenänderung mit
theView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
Aber ohne Erfolg. Es scheint nur dehnen und verzerren, meine Ansichten.
In meinem MainViewController, fügte ich diese Zeile in einem Versuch, die Größe von allen meinen Seiten Ansichten:
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width * ([self.viewControllers count]), self.scrollView.frame.size.height);
for (int i = 0; i < [self.viewControllers count]; i++) {
PageViewController *controller = [self.viewControllers objectAtIndex:i];
if ((NSNull *)controller == [NSNull null])
continue;
NSLog(@"Changing frame: %d", i);
CGRect frame = self.scrollView.frame;
frame.origin.x = frame.size.width * i;
frame.origin.y = 0;
controller.view.frame = frame;
}
}
Aber es hat nicht helfen zu viel (weil ich faul laden Sie die Aussicht, so dass nicht alle von Ihnen sind unbedingt geladen werden, wenn dieser ausgeführt wird).
Gibt es eine Möglichkeit, dieses problem zu lösen?
InformationsquelleAutor der Frage jbrennan | 2010-03-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich verstehe deine Frage richtig, die Antwort ist gegeben in diesem ausgezeichneten WWDC-Präsentation: https://deimos.apple.com/WebObjects/Core.woa/BrowsePrivately/adc.apple.com.4092349126.04109539109.4144345585?i=1699219987 (Beachten Sie, dass ein registrierter iPhone-Entwickler Zugriff auf diese videos).
Durch die Art und Weise, ist es notwendig, eine separate UIViewController (PageViewController) für jede Seite in Ihrer UIScrollView? Warum nicht lassen Sie Ihre MainViewController kümmern.
Größenänderung Ihre Ansichten (und Ihr UI im Allgemeinen), nach drehen des Geräts ist viel einfacher beim erstellen der UI in den Interface Builder.
Wieder, ich empfehle das WWDC-session weiter oben verlinkt, wie es geholfen, mich ein wenig mit seitenweise Blättern, Ansichten und wie Sie zu behandeln-Drehung.
Viel Glück!
InformationsquelleAutor der Antwort Bart Jacobs
Habe ich erfolgreich erreicht dies mit folgenden Verfahren:
.h-Datei-code:
============================================================================================
.m-Datei
@synthetisieren scrollView;
@synthetisieren arrayContentData, viewControllers, bolPageControlUsed, intCurrIndex;
//Am Ende des scroll-animation, setzen Sie die Boolesche verwendet, wenn die Schriftrollen stammen aus der UIPageControl
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
selbst.bolPageControlUsed = NO;
}
Ich hoffe, es wird hilfreich sein für alle.
Cheers.
InformationsquelleAutor der Antwort Nishant B
Bin mir absolut nicht sicher, ob ich verstehe Sie Recht.. aber, einige Gedanken:
Die frame-Eigenschaft ist eine Sache (A), wie der view-Inhalte angezeigt werden, gibt es eine andere (B). Die CGRect frame ist die (theoretische) Grenze Ihrer Sicht in der superview (parent view) .. aber, Ihre Ansicht müssen nicht unbedingt füllen, das ganze frame-Bereich.
Bezüglich (A):
Hier haben wir die UIView ' s
autoresizingMask
- Eigenschaft, um festzulegen, wie der Rahmen geändert werden, wenn der superview ist in der Größe angepasst. Was passiert, wenn Sie die Ausrichtung ändern. Sie können jedoch in der Regel verlassen sich auf die Standard-Einstellungen (arbeitete für mich so weit).Bezug (B):
Wie die Ansicht des Inhalts sind distributet in den Ansicht-frame angegeben wird, die von UIView Eigentum
contentMode
. Mit dieser Eigenschaft können Sie einstellen, dass das Seitenverhältnis muss bleiben intakt. Legen Sie es aufUIViewContentModeScaleAspectFit
zum Beispiel, oder etwas anderes..finden Sie hier:
http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/doc/uid/TP40006816-CH3-SW99
PS: ich schrieb "theoretisch", weil Ihrer Ansicht Inhalte können auch über die frame-Grenzen - Sie sind nur die Begrenzung der Ansicht, wenn UIView ' s clipsToBounds Eigenschaft auf JA festgelegt ist. Ich denke, es ist ein Fehler, den Apple gesetzt, das standardmäßig auf NO.
InformationsquelleAutor der Antwort Efrain
Zusätzlich zu dem, was Efrain schrieb, beachten Sie, dass die frame-Eigenschaft IST NICHT GÜLTIG, wenn der view-Transformation wird eine andere als die Identität transformieren -- d.h.wenn die Ansicht gedreht wird.
Natürlich, man berücksichtigt die Tatsache, dass Ihre Ansichten müssen auf eine neue offset-position, richtig?
InformationsquelleAutor der Antwort Olie