UIScrollView nicht immer neue Größe auf die Ausrichtung ändern
Habe ich eine sehr einfache UIScrollView
Beispiel, das einfach nicht tut, was es soll.
Nicht sicher, ob es ein Fehler mit der API oder ein Fehler in meinem code.
Grundsätzlich, ich habe eine UIViewController
mit einem UIScrollView
wie es Ansicht.
Wenn ich es in der UIWindow
und ändern Sie die Ausrichtung des iPad logge ich mich wieder aus der UIScrollView
s-Größe, die ist falsch(?) gemeldet.
Hier mein UIViewController
Umsetzung:
@implementation CustomViewController
- (void)loadView {
scrollView = [[[UIScrollView alloc] init] autorelease];
scrollView.delegate = self;
scrollView.backgroundColor = [UIColor redColor];
self.view = scrollView;
}
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
CGSize rect = scrollView.frame.size;
NSLog(@"will rotate w%f h%f", rect.width, rect.height);
}
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
CGSize rect = scrollView.frame.size;
NSLog(@"will animate rotation w%f h%f", rect.width, rect.height);
}
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
CGSize rect = scrollView.frame.size;
NSLog(@"did rotate w%f h%f", rect.width, rect.height);
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return YES;
}
@end
Wenn ich den obigen code sehe ich folgende Einträge in meine Konsole:
2010-07-11 11:03:05.214 Untitled2[6682:207] will rotate w768.000000 h1004.000000
2010-07-11 11:03:05.214 Untitled2[6682:207] will animate rotation w748.000000 h1024.000000
2010-07-11 11:03:05.619 Untitled2[6682:207] did rotate w748.000000 h1024.000000
2010-07-11 11:03:07.951 Untitled2[6682:207] will rotate w748.000000 h1024.000000
2010-07-11 11:03:07.958 Untitled2[6682:207] will animate rotation w768.000000 h1004.000000
2010-07-11 11:03:08.367 Untitled2[6682:207] did rotate w768.000000 h1004.000000
Wie Sie sehen können, die Ausrichtung ändert sich nicht die Größe des UIScrollView
, aber nur, um damit die neuen statusbar.
Ich würde erwarten, dass die Breite und Höhe drastisch ändern, als die UIScrollView
ist, wie Sie breiter als Sie hoch ist und Umgekehrt.
Ist es ein Weg, um die UIScrollView
zu berichten, es ist wahre Größe?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich die Antwort, wenn Sie noch auf der Suche. Testen Sie die Grenzen, nicht den Rahmen.
Grund: frame ist eine abgeleitete Eigenschaft der Grenzen und die Transformation angewendet wird, für die rotation.
Ansichten werden nicht automatisch in der Größe anpassen, wenn sich Ihre superviews ändern der Größe, sofern Sie nicht explizit gesetzt werden. Für das scroll-view müssten Sie es sagen, auf die Größe, seine Breite und Höhe, wenn seine superview tut.
Habe ich bemerkt, dass die Bestimmung der neuen
contentSize
imdidRotateFromInterfaceOrientation
ist auch unmöglich, wenn Sie beginnen mit einem iPhone NIB-Datei anstelle einer dedizierten iPad-NIB-Datei: Bilder der iPhone-NIB-Dateien sind viel kleiner und damit die berechnete Höhe der Inhalte wird viel größer, als es sein sollte, wenn Sie tatsächlich auf einem iPad. Apple HAT gesagt, dass ich MUSS, erstellen Sie eine separate iPad-NIB-Datei...So, ich will auch die alten Maße in
didRotateFromInterfaceOrientation
, aber für mich ist es jetzt weniger ein problem, da iOS nicht umgehen alles OK, sobald ich beginnen mit den rechten der NIB-Datei. Noch, es scheint weniger intuitiv zu mir, dass in derdidRotateFromInterfaceOrientation
Methode der frame-Dimensionen sind falsch für die aktuelle Ansicht.PS. Ich habe eine Lösung zu finden, am Ende, verwenden Sie einfach die Benachrichtigungen statt
didRotateFromInterfaceOrientation
.Dann in der
orientationChanged
Methode, passen Sie die Aussicht auf den neuen Rahmen. Ich hatte ein letztes problem: wenn die erste Orientierung war anders als die Orientierung der Feder der Ansicht wäre immer noch falsch, ich löste das Problem durch erstellen einer neuen NIB-Datei speziell für die Ansicht im Querformat. In der init-Methode derViewController
wählt die Feder lädt er anhand der aktuellen Ausrichtung.Weiß ich nicht, es wird dir helfen, weil ich nie getestet, aber ich denke, es könnte helfen, Sie
Ich in der Regel fix, dass durch die Festlegung eines Wertes der
contentSize
0 wieCGSizeMake(contentSize.width, 0)
für die horizontale Ansicht.Zwingen
UIScrollView
zu scrollen, nur z.B. horizontale nicht-scrollbaren Wert fürcontentSize
auf 0 >CGSizeMake(contentSize.width, 0)
.Ich hoffe, es hilft.