2016-07-07 15 views
0

Für meinen Job helfe ich bei der Gestaltung einer iOS App und so habe ich kürzlich angefangen mit Swift zu arbeiten. In der App haben wir drei verschiedene Elemente: ein Google Maps-Element und zwei Grafiken. Ich möchte es so machen, dass, wenn Sie auf eines dieser Elemente drücken, wird die Größe angepasst, um auf den Bildschirm zu passen, und wenn Sie den Bildschirm erneut drücken, werden sie auf ihre ursprüngliche Größe zurückkehren.Swift: Größe des Elements programmatisch auf verschiedenen Geräten finden

Füllen Sie den Bildschirm ist kein Problem, und ich habe bereits erfolgreich implementiert. Wenn Sie jedoch erneut drücken, erscheint das Element kleiner oder größer als es ursprünglich war, je nachdem, auf welchem ​​Gerät Sie es ausführen. Momentan minimiere ich es, indem ich die Attribute height und width des Elements verwende und diese auf die ursprünglichen Werte für diese Attribute zurückstelle, wenn der Benutzer das Vollbildelement drückt. Es scheint jedoch, dass diese fest codiert sind, anstatt für jedes Gerät, auf dem Sie sich befinden, dynamisch erstellt zu werden, und dies ist der Grund, warum es nicht korrekt zu seiner ursprünglichen Größe zurückkehren wird.

Hier ist zur Zeit, was ich in meinem Code haben:

@IBAction func mapButtonClicked(sender: AnyObject) { 
    if mapExpanded == false { 
     mapView.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height) 
     mapButton.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height) 
     mapExpanded = true 
    } else { 
     mapView.frame = CGRectMake(0, 0, oldMapWidth, oldMapHeight) 
     mapButton.frame = CGRectMake(0, 0, oldMapWidth, oldMapHeight) 
     mapExpanded = false 
    } 
} 

wo oldMapWidth = self.view.mapView.width und oldMapHeight = self.view.mapView.height.

Ich habe versucht, es relativ zum Bildschirm zu ändern, aber das funktioniert nur auf einem einzigen Gerät und gibt die gleichen Probleme beim Wechsel zu einem anderen Tablet. Gibt es ein anderes Attribut, das die Höhe und Breite nach dem Kompilieren angibt, so dass es für das aktuelle Gerät, auf dem es sich befindet, korrekt ist?

+0

Sind Sie sicher, dass die alte MapHeight und Breite das sind, was Sie erwarten? Erstellen Sie ein Protokollereignis, wenn Sie das MapButton zum ersten Mal drücken, und protokollieren Sie die Breite und Höhe der aktuellen Ansicht und vergleichen Sie diese mit dem, was Sie in diesen beiden Variablen gespeichert haben. Ich nehme an, dass sie unterschiedlich sein werden ... Die einfachste Lösung wäre, diese zwei Variablen innerhalb des mapButtonClick zu setzen, kurz bevor Sie den Vollbildmodus machen. Dann sollte die Rückkehr gut funktionieren, egal welches Gerät. – Putz1103

+0

Sie waren nicht, was ich dachte, sie würden sein. Sie entsprechen ihrer Größe in der Ansicht Beliebig auf dem Storyboard, die bei der Ausführung nicht auf den Geräten angezeigt wird. Die Frage wurde jedoch beantwortet, danke für einen Blick. – tdolphay

+0

Die Frage wurde 17 Minuten beantwortet, nachdem ich kommentiert und Ihnen einen Rat gegeben hatte (was der Antworter anscheinend ziemlich wörtlich genommen hat). – Putz1103

Antwort

0

Was ist mit der Erhaltung des Rahmens und der Einstellung vor dem Expandieren? Dieser Test Code scheint perfekt für mich zu arbeiten:

class ViewController: UIViewController { 

    @IBOutlet weak var mapView: MKMapView! 
    @IBOutlet weak var mapButton: UIButton! 
    var mapExpanded = false 
    var oldFrame = CGRectZero 

    @IBAction func mapButtonClicked(sender: UIButton) { 
     if mapExpanded == false { 
      // before expanding, set old 
      oldFrame = mapView.frame 

      mapView.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height) 
      mapButton.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height) 
      mapExpanded = true 
     } else { 
      mapView.frame = oldFrame 
      mapButton.frame = oldFrame 
      mapExpanded = false 
     } 
    } 
} 

In meinem Beispiel I Automatisches Layout im Storyboard bin mit der Karte und Taste zu platzieren. Ich empfehle dasselbe.

+0

Das ist wirklich glatt. Ich wusste nicht, dass du einfach etwas so einfach machen kannst, wie nur einen Rahmen gleich einem anderen zu setzen. Sieht so aus, als ob das perfekt funktioniert. Danke für die Hilfe! – tdolphay