2012-06-18 1 views
6

Ich habe ein UIScrollView im Storyboard erstellt, es als Eigenschaft mit dem View-Controller verknüpft und versuche jetzt einige Subviews mit Paginierung hinzuzufügen. Aber, obwohl ich die Dimensionen im Storyboard grafisch festlege, endet der Frame von UIScrollView mit 0,0,0,0. Muss ich die Dimensionen fest codieren, obwohl ich sie bereits grafisch im Storyboard angegeben habe?ScrollView im Storyboard erstellt initialisiert mit Frame 0,0,0,0

Auch, irgendwie verwandt, ist es möglich, Subviews im Storyboard anzupassen, in dieser Bildlaufansicht zu verwenden? Es scheint, dass ich eine solche Ansicht nicht erstellen kann, es sei denn, sie befindet sich bereits in einem Controller. Da ich nur einen Controller und möglicherweise mehrere Ansichten habe, die ich grafisch einrichten möchte, wie mache ich das, ohne dass ich das programmatisch machen muss?

+0

Wie haben Sie den UIScrollView gezeichnet? Haben Sie es auf Ihrem ViewController oder in Ihrer Freiform gezeichnet? –

+0

Ich habe es einfach als Objekt vom Storyboard auf den ViewController gezogen. – user1096786

+0

Woher kennen Sie seine 0,0,0,0? Es sollte dieselbe Größe wie die Scrollansicht haben, die Sie in den ViewController gezogen haben. –

Antwort

16

Mit Storyboards viewDidLayoutSubviews ist, wo Sie die Größe all Ihrer Ansichten erhalten können. viewWillAppear hat bei mir nicht funktioniert und immer zurückgegeben (0,0,0,0);

+1

Beachten Sie auch, dass Sie die Größe der darin enthaltenen Unteransichten erfassen können und dann den Layout-Code für die Unteransichten dieser Subviews hinzufügen können, da Sie nun den Rahmen/die Grenzen kennen. –

0

Sie haben wahrscheinlich den Haltepunkt in einer Zeile gesetzt, in der die Ansicht noch nicht eingerichtet war. Versuchen Sie folgendes:

- (id)initWithCoder:(NSCoder *)coder 
{ 
    self = [super initWithCoder:coder]; 
    if (self) { 
     CGRect frame = self.scrollView.frame; 
     NSLog (@"FRAME IS %@", NSStringFromCGRect(frame)); 
    } 
    return self; 
} 
1

Ich fand heraus, dass, wenn ich die Scrollview in viewWillAppear zuzugreifen, wird der Rahmen tatsächlich die richtigen Zahlen geben. Ich habe das zuvor in awakeFromNib und viewDidLoad probiert und bekam auch 0,0,0,0 Frame.

Was ist seltsam vor Storyboard, Sie sind in der Lage, die richtigen Frame-Dimensionen in watchFromNib zu bekommen. Ein Beispiel dafür ist in einem von Apples Beispielcode PageControl.

Also kurz gesagt, die Frage zu beantworten, versuchen Sie es aus viewWillAppear Zugriff (Vorausgesetzt, dass Sie die UIScrollView in der Storyboard erstellt).

+1

Von'AwakeFromNib' Diskussion: Eine watchFromNib Nachricht wird an jedes Objekt gesendet, das aus dem Archiv geladen wird, aber nur wenn es auf die Nachricht antworten kann, und erst nachdem alle Objekte im Archiv geladen und initialisiert wurden. Wenn ein Objekt eine wakeFromNib-Nachricht empfängt, ist garantiert, dass alle seine Ausgangsinstanzvariablen gesetzt sind. Und von dem, was ich getestet habe, bekomme ich keinen Bezug auf meine Steckdose in dieser Methode. Vielleicht ist diese Annahme mit dem Storyboard nicht mehr wahr und die Dokumentation muss aktualisiert werden. Obwohl ich bereits Frame meiner Outlets in 'viewDidLoad' gesetzt habe. – florian

+0

Entschuldigung, ich habe genau das Problem, wenn ich versuche, UIScrollView in das Storyboard zu ziehen, und der Größeninspektor hat seine Größe definiert. Allerdings setze ich einen Haltepunkt in 'viewWillAppear' (nicht' viewDidLoad' !!) und es steht immer noch fest, dass der Rahmen {0,0,0,0} ist. Ich kann zwar manuell darauf zurückgreifen, was passiert aber wenn das UIScrollView vom Storyboard geladen wird? – Yeung

+0

Hey, ich habe herausgefunden, dass ich in 'viewDidAppear' auf den korrekten Bildwert zugreifen kann. Ich baue in Xcode 4.5 und für iPhone 6.0 Simulator. Ist da nicht etwas Update Ursache? – Yeung

3

Storyboards mit den Auslässen eines Controllers sind nicht verbunden, bevor viewDidLoad und die Größe der es erst viewWillAppear gesetzt, siehe hier:

http://cs193p.m2m.at/lecture-8/

Sobald der Controller vollständig instanziiert und seine Ausgänge sind angeschlossen ViewDidLoad: heißt. Somit ist dies ein guter Ort, um Setup-Code zu setzen. Allerdings ist die Größe des Controllers noch nicht eingestellt, aber in viewWillAppear: welcher aufgerufen wird, kurz bevor die Ansicht auf Bildschirm erscheint.

Also ich denke, Enricos Vorschlag ist richtig. Versuchen Sie einfach, das größenbezogene Material in viewWillAppear einzufügen.

+0

viewDidLayoutSubviews für Storyboards. Siehe meinen Kommentar unten. –

0

Es ist ganz einfach: Deaktivieren Sie Verwenden Sie in den Storyboard-Einstellungen Autostart.

Disable Use Autolayout in the Storyboard settings (red rectangle)

Verwandte Themen