2013-07-16 12 views
5

Ich habe eine Bildlaufansicht in meiner App, durch Storyboard initialisiert, und ich versuche, den Rahmen zu ändern. Alles scheint zu funktionieren, aber wenn der Rahmen und die Inhaltsgröße nur kurze Zeit nachdem sie gesetzt sind, aufgerufen werden, aber nachdem meine Methode zurückkehrt, sind sie anders! Hier ist der Code:UIScrollView geheimnisvoll ändern Rahmen und Inhalt Größe

CGFloat inputHeight = inputView.frame.size.height; 
originalContentHeight = self.scrollableContentView.frame.size.height; 
NSLog(@"%f", self.scrollableContentView.frame.size.height-inputHeight); 
[self.scrollableContentView setFrame:CGRectMake(self.scrollableContentView.frame.origin.x, self.scrollableContentView.frame.origin.y, self.scrollableContentView.frame.size.width, self.scrollableContentView.frame.size.height-inputHeight)]; 
NSLog(@"%f", self.scrollableContentView.frame.size.height); 
NSLog(@"%@", self.scrollableContentView); 

Die Ausgabe dieser Protokolle wird als erwartet, das heißt:

<UIScrollView: 0x808de00; frame = (0 0; 320 81); ... > 

Allerdings, wenn ich einen Haltepunkt in einem anderen Verfahren festgelegt, durch die Zeit, die aufgerufen wird, dies zeigt die Scroll Anmeldung:

<UIScrollView: 0x808de00; frame = (0 0; 320 416); ... > 

Zusätzlich werden die Inhalte Größenänderungen als solche:

(width=320, height=416) 

zu

(width=320, height=504) 

Beide Werte scheinen automatisch auf die Werte werden zurückkehrt sie haben, wenn die Ansicht first out gelegt wird. Ich habe Haltepunkte im Getter und Setter meiner Bildlaufansicht gesetzt und kann keine unerwarteten Zugriffe finden, daher bin ich zu dem Schluss gekommen, dass die Änderung intern erfolgen muss. Ist das eine berechtigte Schlussfolgerung? Was könnte schief gehen?

+0

Können die Autoresizer-Federn auf eine einstellbare Höhe eingestellt werden? – Jamie

+0

Wo würde ich das finden? – Jumhyn

+0

Dies ist wegen des automatischen Layouts. Schalten Sie diese Option aus oder ändern Sie die Größe der Bildlaufansicht, indem Sie Constraints anpassen und nicht Frames festlegen. – rdelmar

Antwort

6

Wenn Sie das automatische Layout verwenden, sollten Sie die Einschränkungen ändern und nicht den Rahmen der Bildlaufansicht festlegen.

Siehe meine Antwort auf eine ähnliche Frage here. Es enthält einige Links zu Beispielen zum programmgesteuerten Festlegen von Einschränkungen.

In welcher Methode setzen Sie auch frame und contentSize? Da Sie ein Storyboard verwenden, wäre es in viewDidLoad oder viewWillAppear: besser, diesen Code stattdessen zu viewDidLayoutSubviews zu verschieben.

+0

Ich habe tatsächlich den Code in 'viewDidLayoutSubviews' (gemäß meiner Frage Geschichte). Ich werde das heute später versuchen. – Jumhyn

+1

Constraints sind der Weg zu gehen. Ich fand tatsächlich, dass der beste Weg, es zu tun war, eine Steckdose zu der Einschränkung in Interface Builder hinzuzufügen, und bearbeiten Sie dann die Eigenschaft "Konstante". – Jumhyn

+0

@Jumhyn Ja, ich finde auch, dass es eine einfache Möglichkeit ist, eine Einschränkung zu ändern, wenn sie bereits in einem Storyboard vorhanden ist. Ich bin froh, dass es funktioniert hat! –

Verwandte Themen