Autolayout, Scrollview/Scrolling und wie kommt da noch ein schöner TextView rein

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Aufgrund der Corona-Krise: Die Veröffentlichung von Stellenangeboten und -gesuchen ist bis 31.12.2020 kostenfrei. Das beinhaltet auch Angebote und Gesuche von und für Freischaffende und Selbstständige.

  • Autolayout, Scrollview/Scrolling und wie kommt da noch ein schöner TextView rein

    Hallo Zusammen,

    versuche mich gerade in einem ViewController und dem Thema Scrolling. Ich möchte einen View haben in dem oben ein paar Elemente wie TextFields, Labels, Buttons sind und ein Ergebnis im unteren Bereich in einem TextView eingetragen werden. Da die Ergebnismenge unterschiedlich groß ist, habe ich den TextView scrollbar gemacht und auf eine bestimmte Größe gezogen. Soweit hat das alles schön geklappt.

    Dann wollte ich gern noch das iPhone auch im Querformat nutzen. Damit sind dann leider nicht mehr alle Elemente im TextView lesbar. Okay ... also "schnell" ein UIScrollView drüber gehängt. Da habe ich dann alle Elemente reingezogen. Dann ca. gefühlte 50 Stunden mit den Constraints gespielt. Jetzt ist es zwar in beiden Formaten (Hochkant/Quer) nutzbar, aber nur wenn ich meinen ScrollView künstlich auf 400 Pixel reduziere.

    Färbt man mal die ganzen Views ein, kommt man zu ungefährem Bild (s. Anlage). "Weißer" View als oberste Ebene im ViewController. Dadrin hängt ein Scrollview (grün) mit den ganzen Elementen. Hier mal schematisch zwei "graue" Buttons und den "blauen" scrollbaren TextView dargestellt. Der grüne Scrollview ist jetzt wie gesagt 400px hoch. Im Querformat sieht das dann leider wieder so aus, dass man den blauen TextView nicht bis zum Ende per Scrolling erreicht.

    *tilt* ... kann jemand das Problem nachvollziehen? Braucht's das sagenumwogende XCode-Projekt?
    oder mal eine Frage an die Profis: nutzt ihr überhaupt Storyboard (ich find das ja immer so nett zum Anschauen) und dann auch noch Autolayout (sollte das Leben ja mit iOS7 einfacher machen).

    Danke für Ideen, Anregungen und alles, was mich wieder schlafen lässt.
    Gruß
    ----
    Macht's gut und danke für den Fisch
  • Autolayout und ScrollView ist so eine Sache. Ich hab das nie verstanden und hab deswegen ein Support-Ticket aufgewendet. Vlt. hilft dir das ja weiter. Denn wenn ich es richtig verstanden habe, stimmt da nicht, dass man scrollen kann oder?
    Follow-up: 602697253

    Hi Nils,

    The problem with the sample project you sent me is that there is a Center Horizontal and Center Vertical Constraint linking GraphView to its parent (the scroll view). These constraints will cause the graph view to become centered again each time layout occurs. A side effect of this is that it also resets the zoom level. These two constraint need to be removed. See ScreenShot1.

    Interface builder will immediately throw up an error when you remove these constraints because the position and height of Graph View are now undefined. This may seem counterintuitive, because Graph View is pinned to its superview (the scroll view) on all sides. However, as mentioned in TN2154 [1], the size of the content inside a scroll view dictates the content size of the scroll view. Graph View therefore must have an explicit width and height. You could add explicit width and height constraints to Graph View but you run into the issue of what value to set for the height since presumably your app will run on both devices with 3.5" displays and 4" displays.

    The solution is to defer that decision until runtime by telling Interface Build that Graph View will supply and intrinsic content size. Select Graph View in interface builder and switch to the size inspector. From the Intrinsic Size pulldown menu, select placeholder. See ScreenShot2. Leave the default width/height values.

    Now, in GraphView.m, you must override the -intrinsicContentSize method and return an intrinsic content size for the graph view. Because GraphView should fill the scroll view, the return value should be the scrollview's bounds.size.

    - (CGSize)intrinsicContentSize
    {
    return self.superview.bounds.size;
    }

    I've attached the modified project for you reference.
  • Hm ... weiß nicht, ob bzw. wie mir das hilft.

    Habe anbei mal den Projektauszug drin.
    Im Storyboard könnt ihr gut mit dem markierten ScrollView-Parameter spielen. Aktuell ist er auf 400. Wenn der auf einen höheren Wert steht, ist zwar im Hochformat alles schön, aber im Querformat wird dann nicht mehr gescrollt. Ist er so wie jetzt oder kleiner. Muss ich schon im Hochformat scrollen, um den gesamten TextView zu lesen (ist ja auch logisch). Dafür wird es im Querformat überhaupt erst möglich den TextView bis fast zum Ende zu erreichen.

    Danke für Anregungen.

    Gruß
    iet
    ----
    Macht's gut und danke für den Fisch
  • Bei der Kombination Autolayout und Scrollviews gibt es zwei mögliche Ansätze:
    1. Bei dem klassischen Ansatz setzt Du in viewDidLayoutSubviews des Viewcontrollers die contentSize des Scrollviews. Der Contentview muss dann translatesAutoresizingMaskIntoConstraints = YES haben. Das erreichst Du im Storyboard, in dem Du keine Constraints zwischen Scroll- und Contentview anlegst.
    2. Wenn Du den Contentview über Constrains im Scrollview verankerst, setzt der Scrollview automatisch die Contentsize. Bei programmatisch erzeugtem Contentview musst Du explizit translatesAutoresizingMaskIntoConstraints = NO setzen.

    Das Ganze beschreibt Apple hier.

    Der zweite, schönere Ansatz ist bei Contentviews mit dynamischer Höhe etwas kniffliger. Hier musst Du erst die inneren Views mit dynamischer Höhe dazu bringen, dass sie Ihre richtige Größe bekommen.In der Regel geht das über sizeToFit, und muss der Contentview seine richtige Höhe geben. Die richtige Höhe kannst Du nur erhalten, wenn sie die richtige Breite haben. Das kannst Du beispielsweise über ein Heightconstraint schaffen, auf das Du über ein Outlet zugreifst. Schließlich musst Du die Hugging- und Compression-Prioritys noch so einstellen, dass die Views nicht gequetscht werden.
    „Meine Komplikation hatte eine Komplikation.“