2016-07-20 13 views
0

Ich verwende Storyboard mit autolayout. In meiner ViewController habe ich eine Grundstruktur: eine UIScrollView und eine contentView (UIView), die verschiedene Bezeichnungen enthält). Dann habe ich verschiedene Elemente, die ich in der viewDidAppear Methode der Klasse in meinem contentView hinzufügen, dann um es neu zu berechnen ist Baugröße ich dies tun:UIView-Frame wird nicht aktualisiert in viewDidAppear

- (void)fixContentViewHeight 
{ 
    _contentView.frame = CGRectMake(_contentView.frame.origin.x, _contentView.frame.origin.y, _contentView.frame.size.width, operators.frame.origin.y + operators.frame.size.height); 
    //constraint for contentView height 
    _contentViewHeight.constant = operators.frame.origin.y + operators.frame.size.height; 
} 

- (void)fixScrollViewHeight 
{ 
    _scrollView.frame = _contentView.frame; 
    _scrollView.contentSize = _contentView.frame.size; 
} 

wo operators ist die letzte veröffentlichte Element contentView, es ist immer auf der Unterseite des Rahmens. Ich rufe diese 2 Methoden innerhalb der viewDidAppear und sie machen die Ansicht scrollbar, das Problem ist, dass der Rahmen von contentView nicht aktualisiert wird, so dass die letzten Elemente immer unclickable sind (weil sie außerhalb des Rahmens der Ansicht platziert sind).

Was mache ich falsch? Warum wird die scrollView scrollbar, aber die contentView behält ihren alten Rahmen?

+0

Verwenden Sie das automatische Layout? – Miknash

+0

@NickCatib ja Ich benutze Autolayout – Signo

Antwort

3

Wenn Sie Beschränkungen für die automatische Layouting-Funktion haben, die sich auf die Höhe von _contentView auswirken, können Sie die Höhe nicht ändern, indem Sie den Rahmen festlegen, da die Einschränkungen dies überschreiben.

Sie müssen (und sollten) in Ihrem Code neue/modifizierende Einschränkungen hinzufügen, wenn Sie neue Elemente hinzufügen. dann ruft

_contentView.layoutIfNeeded() 

Nachdem alle Updates die UI-Update zu lassen, wenn es erforderlich ist, was es sein sollte.

+0

Ich habe versucht, eine Höhe Einschränkung in meinem ContentView, ich aktualisiere es wie in dem Code oben geschrieben: '_contentViewHeight.constant = operators.frame.origin.y + Operatoren .frame.size.height; ' Der angegebene Wert ist korrekt, aber die Höhe ändert sich nicht. Wenn ich '[_contentView layoutIfNeeded]' 'aufruft, wird die' scrollView' nicht scrollbar – Signo

+1

@Signo 1. Sie können die Rahmenhöhe und die Höhenbeschränkung nicht einstellen. Diese sind widersprüchlich. 2. Sie sollten versuchen, lassen Sie Autolayout all diese Arbeit für Sie, anstatt die Höhe manuell berechnen, fragen Sie automatisches Layout für Sie berechnen, mit oberen/unteren Beschränkungen für alle Elemente. 3. Wenn Sie 'layoutIfNeeded' verwenden, wird _contentView korrekt expandiert? 4. Gibt es Einschränkungen von der Inhaltsansicht zum oberen Rand der Bildlaufansicht und von unten nach unten? 5. Haben Sie versucht, 'layoutIfNeeded' in beiden Ansichten aufzurufen? –

+1

Ich habe es funktioniert! Nach dem Lesen von Punkt 4 habe ich meine Einschränkungen in IB erneut überprüft und es gab 2 widersprüchliche Einschränkungen.Ich habe die Einschränkungen von "contentView" gelöscht und jetzt funktioniert es gut, danke :) – Signo

1

Bitte aktualisieren UI On Main Queue

dispatch_async(dispatch_get_main_queue(), ^{ 
      // update any UI on Main queue 
     }); 
+0

Basierend auf den bereitgestellten Informationen, wird dies nicht helfen, OP hat angegeben, dass die Scrollview aktualisiert wird, so dass es in Ordnung ist. OP hat auch keine Hintergrundaufgaben erwähnt. –

1

Ich denke, dass alle Rahmen bezogene Informationen innerhalb viewWillLayoutSubviews() und viewDidLayoutSubviews() sein sollte. Sie können Sachen in viewDidLoad() hinzufügen, aber für irgendeine Rahmenverwaltung würde ich erwähnte Methoden verwenden.

In Ihrer speziellen Situation verwenden Sie ehemalige, viewDidLayoutSubviews(). Sie können diese Art von Problemen jedoch mithilfe von Einschränkungen lösen, die mit dem Code verknüpft sind, wie @Simon McLoughlin erwähnt hat. "scrollView wird nicht scrollbar" bedeutet, dass Sie auch contentSize aktualisieren sollten, also behalten Sie dies auch im Auge.

0

Versuchen Sie, vertikale Platzbeschränkungen zwischen der Bildlaufansicht und dem zuletzt platzierten Element hinzuzufügen.