UsableView ändert die Größe der IT -Größe bei der Änderung der Geräteorientierung nicht korrekt

StackOverflow https://stackoverflow.com/questions/8338963

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

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top