UsableView ändert die Größe der IT -Größe bei der Änderung der Geräteorientierung nicht korrekt
-
26-10-2019 - |
Frage
Dies mag eine Neulingsfrage klingen, aber ich bin neu bei iOS Dev.
Ich habe UIWebView und UitableView in meiner iPad -Ansicht. Im shouldAutorotateToInterfaceOrientation
Ich ändere die Größe, um sie so auszusehen.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
if( interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown){
CGRect f = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height / 2);
self.mTextView.frame = f;
f = CGRectMake(0, self.view.frame.size.height / 2, self.view.frame.size.width, self.view.frame.size.height / 2);
self.mTableView.frame = f;
}
if( interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight) {
CGRect f = CGRectMake(0, 0, self.view.frame.size.width / 2, self.view.frame.size.height);
self.mTextView.frame = f;
f = CGRectMake(self.view.frame.size.width / 2, 0, self.view.frame.size.width / 2, self.view.frame.size.height);
self.mTableView.frame = f;
}
return YES;
}
Nun die Frage: Für die erste Belastung wird die Tabellenansicht mit korrekten Größen gezeichnet, aber wenn ich in den Porträtmodus wechsle, wird die UitableView weiter in den Landschaftsmodus wechselt als im Rahmen angegeben. Warum passiert das und wie kann ich das beheben?
Ps. Ich habe auch versucht, die Frames für alle Zellen in derselben Methode zu setzen, hat nicht geholfen.
PSS. Dies geschieht nur auf dem Gerät, auf Simulator UitableView wird korrekt angezeigt
Lösung
shouldAutorotateToInterfaceOrientation:
Gibt nur einen booleschen Wert zurück, der angibt, ob der Ansichtsregler die angegebene Orientierung unterstützt. Sie sollten in dieser Methode keine UI -Transformation durchführen, stattdessen alles in tun willAnimateRotationToInterfaceOrientation:duration:
.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration
{
if( interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown){
CGRect f = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height / 2);
self.mTextView.frame = f;
f = CGRectMake(0, self.view.frame.size.height / 2, self.view.frame.size.width, self.view.frame.size.height / 2);
self.mTableView.frame = f;
}
if( interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight) {
CGRect f = CGRectMake(0, 0, self.view.frame.size.width / 2, self.view.frame.size.height);
self.mTextView.frame = f;
f = CGRectMake(self.view.frame.size.width / 2, 0, self.view.frame.size.width / 2, self.view.frame.size.height);
self.mTableView.frame = f;
}
}
Schauen Sie sich die Dokumentation für UIViewController an, Es ist gut erklärt.
Andere Tipps
iOS nennt diese Funktion nur einmal! Für diese Arbeit, wie Sie es erwarten, müssen Sie diese Zeile in die hinzufügen (void)viewDidLoad
Funktion:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];
Und machen (void)orientationChanged:(id)object
Funktion:
- (void)orientationChanged:(id)object{
UIInterfaceOrientation interfaceOrientation = [UIApplication sharedApplication] statusBarOrientation;
if(UIInterfaceOrientationIsPortrait(interfaceOrientation)){
// some works
}else if(UIInterfaceOrientationIsLandscape(interfaceOrientation)){
// another works
}
}
Ich hoffe es ist nützlich für Sie!
Sie können die Größe von UitableView sowohl im Porträt- als auch in den Landschaftsmodi ändern. UtableView -Änderung der Größe automatisch in einem Verhältnis in Bezug auf den vorherigen Orientierungsmodus. So können Sie die gewünschte Größe für beide Modi reparieren.
Hoffe diese Arbeit für dich.
Bitte überprüfen Sie die autoResizing
Eigentum der Ansichten.
Der einfachste Weg ist, dass Sie 2 unterschiedliche Ansichten für das Porträt- und Landschaftsmodus machen können. Wenn sich der Modus ändert, können Sie die Ansicht leicht ändern. So was:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
if (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
self.view = self.portraitView;
else
self.view = self.landscapeView;
[tblScore reloadData];
return YES;
}
Sie nutzen AutoResizing
Denn dies muss keine Codierung für Frame durchgeführt werden.http://developer.apple.com/library/IOS/#documentation/windowsviews/conceptual/viewpg_iphoneos/creatingviews/creeatingviews.html