2016-07-15 18 views
1

Ich habe eine UIScrollView gemacht und es wird horizontal gescrollt.Womit wird UIView auf die Standardgröße zurückgesetzt, wenn der UIScrollView, der es enthält, gescrollt wird?

Innerhalb der UIScrollView enthält eine UIView ein UILabel, um einen Text und eine UIButton anzuzeigen, um die Ansicht auszublenden.

Die Breite der Ansicht ändert sich, wenn der Text in der Beschriftung vom Benutzer geändert wird, während die Schaltfläche ihre Größe behält.

Ich möchte, dass der UIView seine Größe behält, wenn der UIScrollView nach links und rechts gescrollt wird. Die UIView wird jedoch beim Scrollen wieder auf die ursprüngliche Größe zurückgesetzt.

Das Bild unten zeigt, was das Storyboard eingerichtet ist; Zwei Rechtecke sind UIViews und UILabels in jedem haben standardmäßig den Text "Label". Ein Buchstabe X ist eine Schaltfläche. Der horizontale Bereich, der diese beiden enthält, ist UIScrollView.

enter image description here

Die nächste ist die Szene, die ich die App im Simulator laufen. Ich habe die Grenzen dieser UIViews programmgesteuert geändert. Diese Texte werden aus dem Menü ausgewählt, das ich erstellt habe, und die Breite von UIViews wird geändert, wenn sich die Breite von UILabels ändert. Ignoriere, warum beide Labels denselben Text haben; Ich habe die zweite Ansicht nicht behandelt. Der Fall ist derselbe auch mit nur einer UIView.

enter image description here

Als ich die UIScrollView nach rechts bewegen, tritt das Problem auf. Die Breiten dieser UIViews werden wie im Storyboard festgelegt zurückgesetzt.

enter image description here

theh Funktion unten aufgerufen wird, wenn das Menü ausgewählt wird. Entschuldigung für diese friggin seltsamen Variablennamen

//selectedTextPrim, selectedTextSecn: String() 
//result1Text, result2Text: UILabel 
//result1, result2: UIView 
//result1XBtn, result2XBtn: UIButton 
func processAddResult(){ 
    result1Text.text = selectedTextPrim + " > " + selectedTextSecn 
    result1Text.sizeToFit() 
    result1.frame.size.width = result1Text.frame.size.width + 24 
    result1XBtn.frame.origin.x = result1Text.frame.maxX 

    result2.frame.origin.x = result1.frame.maxX + 8 

    result2Text.text = selectedTextPrim + " > " + selectedTextSecn 
    result2Text.sizeToFit() 
    result2.frame.size.width = result2Text.frame.size.width + 24 
    result2XBtn.frame.origin.x = result2Text.frame.maxX 
//  print("\(result1Text.frame.size.height)") 
} 

Muss der Code geändert werden? Oder gibt es eine Möglichkeit, dies zu verwalten, indem irgendwo Code hinzugefügt wird?

Antwort

2

Ihre Ansichten werden durch automatische Layoutbeschränkungen positioniert. Sie können den Rahmen direkt einstellen (wie Sie es tun), aber das nächste Mal, wenn das System einen Layout-Durchlauf durchführt, setzt das automatische Layout die Rahmen entsprechend den Einschränkungen zurück.

Viele Dinge können einen Layout-Durchlauf auslösen. Einer von ihnen ändert die bounds einer Ansicht. Die Art und Weise, wie eine Bildlaufansicht gescrollt wird, ist die Änderung ihrer eigenen bounds.origin. Jedes Mal, wenn die Bildlaufansicht scrollt, wird ein Layout-Durchlauf ausgelöst. Während dieser Layoutdurchläufe wird jede Änderung, die Sie direkt an die frame einer Ansicht vorgenommen haben, auf den Rahmen zurückgesetzt, der von den Beschränkungen des automatischen Layouts vorgegeben wird.

In diesem Fall sieht es so aus, als ob jedes Etikett automatisch an den Text angepasst werden soll. Auto-Layout kann dies automatisch tun. Wenn Sie keine anderen Beschränkungen für die Größe eines Etiketts festlegen, verwendet das automatische Layout die intrinsicContentSize des Etiketts, die bei jedem Festlegen des Etikettentextes automatisch gesetzt wird.

Dann möchten Sie, dass jedes Hintergrundrechteck automatisch ein Label umgibt. Sie können dies tun, indem Sie die Kanten des Rechtecks ​​auf die Kanten der Beschriftung beschränken (plus Konstanten, um eine Füllung bereitzustellen). Das automatische Layout bewirkt, dass der Rahmen des Rechtecks ​​automatisch dem Rahmen des Etiketts folgt.

Wenn Sie alles richtig machen, die nur Sache, die Sie in Ihrem Code ändern müssen, ist der Text der Etiketten. Das automatische Layout sorgt für die Größenanpassung und Neupositionierung der Beschriftungen und der Hintergrundrechtecke.

Sie sollten sehen “Taking Control of Auto Layout in Xcode 5” from WWDC 2013.