623 Stimmen

UIScrollView Scrollable Content Size Ambiguity UIScrollView Größenambiguität des scrollbaren Inhalts

Liebe Entwickler, ich habe Probleme mit AutoLayout in Interface Builder (Xcode 5 / iOS 7). Es ist sehr grundlegend und wichtig, daher denke ich, dass jeder wissen sollte, wie das ordnungsgemäß funktioniert. Wenn dies ein Bug in Xcode ist, ist es ein kritischer!

Also, immer wenn ich eine Ansichtshierarchie wie diese habe, gerate ich in Schwierigkeiten:

>UIViewController
>> UIView
>>>UIScrollView
>>>>UILabel (oder jedes andere vergleichbare UIKit-Element)

Der UIScrollView hat feste Einschränkungen, z.B. 50 px von jeder Seite (kein Problem). Dann füge ich eine Top Space-Einschränkung zum UILabel hinzu (kein Problem) (und ich kann sogar Höhe / Breite des Labels anheften, ändert nichts, sollte aber aufgrund der intrinsischen Größe des Labels unnötig sein)

Die Schwierigkeiten beginnen, wenn ich eine trailing-Einschränkung zum UILabel hinzufüge:

Z.B. Abstand am Ende zu: Superview Gleich: 25

Jetzt treten zwei Warnungen auf - und ich verstehe nicht warum:

A) Scrollbare Inhaltsgrößenambiguität (Scroll View hat eine unklare scrollbare Inhaltsgröße)

B) Falsch platzierte Ansichten (Label Erwartet: x= -67 Tatsächlich: x= 207

Ich habe dieses minimale Beispiel in einem ganz neuen Projekt gemacht, das Sie herunterladen können, und ich habe einen Screenshot angehängt. Wie Sie sehen können, erwartet der Interface Builder, dass das Label außerhalb der Grenze des UIScrollView sitzt (das orangefarbene gestrichelte Rechteck). Das Aktualisieren des Rahmens des Labels mit dem Resolve Issues Tool bewegt es genau dahin.

Bitte beachten Sie: Wenn Sie den UIScrollView durch eine UIView ersetzen, ist das Verhalten wie erwartet (der Rahmen des Labels ist korrekt und gemäß der Einschränkung). Es scheint also entweder ein Problem mit UIScrollView zu geben oder ich übersehe etwas Wichtiges.

Wenn ich die App ausführe, ohne den Rahmen des Labels wie von IB vorgeschlagen zu aktualisieren, wird es genau richtig positioniert, genau dort, wo es sein sollte, und der UIScrollView ist scrollbar. Wenn ich den Rahmen aktualisiere, ist das Label nicht zu sehen und der UIScrollView scrollt nicht.

Hilf mir Obi-Wan Kenobi! Warum das uneindeutige Layout? Warum die falsch platzierte Ansicht?

Sie können das Beispielsprojekt hier herunterladen und sehen, ob Sie herausfinden können, was passiert: https://github.com/Wirsing84/AutoLayoutProblem

Illustration des Problems im Interface Builder

3voto

Linh Dao Punkte 973

Ich habe dieses Problem für meine Ansicht gelöst, indem ich "Auto Layout-Probleme beheben" > "Fehlende Einschränkungen hinzufügen" für die ausgewählte Ansicht verwendet habe Bildbeschreibung hier eingeben

Die folgenden beiden Einschränkungen lösen mein Problem:

trailing = Stack View.trailing - 10
bottom = Stack View.bottom + 76

wobei: trailing, bottom die trailing, bottom von UIScrollView sind

2voto

Victor Doshenko Punkte 21

Wenn Sie immer noch Probleme mit UIScrollView haben, schalten Sie einfach Content Layout Guides aus (Wählen Sie Ihren ScrollView in der xcode Interface Builder -> wählen Sie den Größeninspektor im rechten Panel -> deaktivieren Sie 'Content Layout Guides') Oder versuchen Sie diese Schritte: xcode 11 Scroll View-Layouts - es kann nützlich sein für einen neuen Layoutstil. Funktioniert gut bei macOS 10.15.2, Xcode 11.3.1, am 05.02.2020

Screenshot anzeigen

2voto

Dave G Punkte 11682

Wenn jemand ein Verhalten bemerkt, bei dem die Scrollleiste auf der rechten Seite scrollt, aber der Inhalt sich nicht bewegt, könnte es sich lohnen, Folgendes zu berücksichtigen:

Sie können auch Einschränkungen zwischen dem Inhalt der Scrollansicht und Objekten außerhalb der Scrollansicht verwenden, um eine feste Position für den Inhalt der Scrollansicht bereitzustellen, sodass dieser Inhalt über der Scrollansicht zu schweben scheint.

Dies stammt aus der Dokumentation von Apple. Wenn Sie beispielsweise versehentlich Ihr oberes Label/Button/Img/View an die Ansicht außerhalb des Scrollbereichs (vielleicht an einen Header oder etwas direkt über der ScrollView) geheftet haben, anstelle des ContentView, würden Sie Ihren gesamten ContentView an Ort und Stelle einfrieren.

2voto

iAj Punkte 3667
import UIKit

class ViewController: UIViewController {

    //
    let scrollView: UIScrollView = {

        let sv = UIScrollView()
        sv.translatesAutoresizingMaskIntoConstraints = false
        return sv
    }()

    let lipsumLbl: UILabel = { // Sie können hier eine Ihrer Unteransichten verwenden

        let lbl = UILabel()
        lbl.translatesAutoresizingMaskIntoConstraints = false
        lbl.text = """
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce eleifend nisi sit amet mi aliquet, ut efficitur risus pellentesque. Phasellus nulla justo, scelerisque ut libero id, aliquet ullamcorper lectus. Integer id iaculis nibh. Duis feugiat mi vitae magna tincidunt, vitae consequat dui tempor. Donec blandit urna nec urna volutpat, sit amet sagittis massa fringilla. Pellentesque luctus erat nec dui luctus, sed maximus urna fermentum. Nullam purus nibh, cursus vel ex nec, pulvinar lobortis leo. Proin ac libero rhoncus, bibendum lorem sed, congue sapien. Donec commodo, est non mollis malesuada, nisi massa tempus ipsum, a varius quam lorem vitae nunc.

        Cras scelerisque nisi dolor, in gravida ex ornare a. Interdum et malesuada fames ac ante ipsum primis in faucibus. Maecenas vitae nisl id erat sollicitudin accumsan sit amet viverra sapien. Etiam scelerisque vulputate ante. Donec magna nibh, pharetra sed pretium ac, feugiat sit amet mi. Vestibulum in ipsum vitae dui vehicula pulvinar eget ut lectus. Fusce sagittis a elit ac elementum. Fusce iaculis nunc odio, at fermentum dolor varius et. Suspendisse consectetur congue massa non gravida. Sed id elit vitae nulla aliquam euismod. Pellentesque accumsan risus dolor, eu cursus nibh semper id.

        Vestibulum vel tortor tellus. Suspendisse potenti. Pellentesque id sapien eu augue placerat dictum. Fusce tempus ligula at diam lacinia congue in ut metus. Maecenas volutpat tellus in tellus maximus imperdiet. Integer dignissim condimentum lorem, id luctus nisi maximus at. Nulla pretium, est sit amet mollis eleifend, tellus nulla viverra dolor, ac feugiat massa risus a lectus. Pellentesque ut pulvinar urna, blandit gravida ipsum. Nullam volutpat arcu nec fringilla auctor. Integer egestas enim commodo, faucibus neque ac, rutrum magna. Vivamus tincidunt rutrum auctor. Cras at rutrum felis. Fusce elementum lorem ut pharetra venenatis.
        """
        lbl.textColor = .darkGray
        lbl.font = UIFont.systemFont(ofSize: 16)
        lbl.numberOfLines = 0
        return lbl
    }()

    //======================================================================//
    //
    // MARK:- viewDidLoad
    //
    override func viewDidLoad() {
        super.viewDidLoad()

        setupViews()
        setupAutoLayout()
    }

    func setupViews() {

        title = "ScrollView-Demo"
        view.backgroundColor = .white
        view.addSubview(scrollView)
        scrollView.addSubview(lipsumLbl)
    }

    func setupAutoLayout() {

        scrollView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        scrollView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

        lipsumLbl.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
        lipsumLbl.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        lipsumLbl.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        lipsumLbl.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
    }
}

Ergebnis:

Hier die Bildbeschreibung eingeben

2voto

ygweric Punkte 986

Die Antwort von @Matteo Gobbi ist perfekt, aber in meinem Fall kann das Scrollview nicht scrollen. Wenn ich "align center Y" entferne und "height >=1" hinzufüge, wird das Scrollview scrollbar.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X