wake-up-neo.com

Swift - UIScrollView scrollt nicht

Mein UIScrollView kann nicht nach unten scrollen. Ich weiß nicht warum. Ich habe bereits die Apple-Dokumentation zu diesem Problem befolgt.

@IBOutlet weak var scroller: UIScrollView!

    override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

}

override func viewDidLayoutSubviews() {
    scroller.scrollEnabled = true
    // Do any additional setup after loading the view
    scroller.contentSize = CGSizeMake(400, 2300)
}

Bitte beraten. Vielen Dank.

26
Mohammad Nurdin

Sie müssen die frame Ihrer UIScrollView so einstellen, dass sie unter der contentsize liegt. Andernfalls wird nicht gescrollt.

Ich würde auch empfehlen, dass Sie scroller.contentSize = CGSizeMake(400, 2300) zu Ihrer viewDidLoad-Methode hinzufügen.

39
Christian

Oft ist der Code korrekt, wenn Sie einem Lernprogramm gefolgt sind. Was viele Anfänger jedoch nicht wissen, ist, dass das ScrollView NICHT normal durch den Simulator gescrollt wird. Es wird angenommen, dass Sie nur scrollen, wenn Sie das Mousepad gedrückt halten und gleichzeitig scrollen. Viele erfahrene Benutzer von XCode/Swift/Obj-C sind so daran gewöhnt und wissen nicht, wie sie von Anfängern möglicherweise übersehen werden. Ciao :-)

@IBOutlet weak var scrollView: UIScrollView!
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(scrollView)
// Do any additional setup after the view
}

override func viewWillLayoutSubviews(){
super.viewWillLayoutSubviews()
scrollView.contentSize = CGSize(width: 375, height: 800)
}

Dieser Code funktioniert einwandfrei, solange Sie das tun, was ich oben gesagt habe

12
flo527

Swift 3.0 Version

scroller.contentSize = CGSize(width: scroller.contentSize.width, height: 2000)
10
Fangming

Geben Sie der Bildlaufansicht keine feste Höhe und geben Sie der Bildlaufansicht immer den oberen Rand der ersten Unteransicht und dem unteren Rand der letzten Unteransicht die Bildlaufansicht. Auf diese Weise wird die Bildlaufansicht automatisch entsprechend der Größe der enthaltenen Unteransichten vergrößert. Die Scrollansicht muss nicht mit contentSize versehen werden. Sie funktioniert sowohl für kleine als auch für große iPhones.

5
Sheetal Shinde

Wenn Sie Autolayout verwenden, funktioniert die contentSize-Eigenschaft nicht mehr und versucht, die Inhaltsgröße aus den Einschränkungen abzuleiten. Wenn dies der Fall ist, besteht das Problem möglicherweise darin, dass Sie nicht die erforderlichen Einschränkungen für die Inhaltsansicht definieren, sodass die Bildlaufansicht die Inhaltsgröße ermitteln kann Kanten der Bildlaufansicht.

3
Carlos Compean

Wenn Sie AutoLayout verwenden,

Legen Sie die Inhaltsgröße in viewdidAppear fest.

func viewDidAppear überschreiben (_ animiert: Bool) {

    scrollView.contentSize = CGSize(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height+300)

}
2
satheesh

Ich weiß nicht, dass dies eine gute Lösung ist, aber Sie können versuchen, die Kopfansicht auf leere UITableView zu setzen.

let scrollView: UIView = UIView(frame: CGRectMake(0, 0, 400, 2300))

tableView.tableHeaderView = scrollView
2
gellezzz

Das Problem könnte sein, dass Ihre scrollView die oben angegebene contentSize nicht kennt, die Korrektur jedoch einfacher ist als die obigen Antworten. Wie Carlos gesagt, aber ich werde mehr ausarbeiten. Wenn Sie möchten, dass Ihre scrollView vertikal rollt (nach oben und unten), stellen Sie Ihre contentView, die in der Hierarchie der scrollView enthalten ist, auf die gleiche Breite wie ViewController und geben Sie ihr eine Höhenbeschränkung, die für Ihr Projekt gilt, z. B. 700. Für das Gegenteil (horizontal) Stellen Sie die Höhe auf den ViewController und die Breite auf eine große Zahl ein, die für Ihr Projekt geeignet ist.

1
Jevon Charles

FWIW, fand ich, dass ich die Lösung von sathish von oben verwenden musste, obwohl es nicht ausreichte, um die Intervention in viewDidAppear allein zu bewirken. Ich musste stattdessen die Anpassung für jede neue Inhaltszuweisung vornehmen:

func display(pattern: Pattern) {
    let text : NSAttributedString = pattern.body()
    patternTextView.attributedText = text

    // Set the size of the view. Autolayout seems to get in the way of
    // a correct size calculation
    patternTextView.contentSize = CGSize(width: 348, height: 620)
}

Die Manifest-Konstanten (ja, ich weiß, yuk, aber es macht es hier einfacher zu verstehen) stammen aus der Autolayout-Spezifikation.

0
Cope

Die Ansicht scheint aus zwei Gründen nicht nach unten zu rücken, da Ihr Code einwandfrei ist.

  • Der erste Grund ist der Scroll-Indikator nicht
  • Zweiter Grund ist nichts in der Ansicht zu zeigen

Der zweite Grund ist nicht genug, um zu sagen, dass Ihre Ansicht kein Bildlauf ist. Wenn Sie den Bildlauf-Indikator jedoch nicht sehen, glauben Sie vielleicht, dass die Ansicht nicht rollt, wenn dies tatsächlich der Fall ist.

Der erste Grund, den ich sehe, ist der Fall, wenn die Einschränkungen nicht im Storyboard festgelegt sind, insbesondere wenn die Ansichtssteuerungsgröße im Storyboard auf "Beliebig" gesetzt ist. Die Bildlaufansicht wäre breiter als der Bildschirm des simulierten oder realen Geräts, und der Bildlaufindikator würde sich somit außerhalb des sichtbaren Bildschirms befinden.

0
Tokuriku

In meinem Fall habe ich UIStackView in UIScrollView verwendet. 

Einige Ansichten-Elemente aus Code zu stackview hinzugefügt .. _. Es wird kein Bildlauf durchgeführt.

Fixiert, indem userInteractionEnabled von stackview auf false gesetzt wurde. 

Ich hatte Probleme damit und konnte keine Antwort für mich finden, bis ich es herausgefunden habe. Ich hatte eine Bildlaufansicht innerhalb einer normalen Ansicht und sobald ich die "Ansicht" durch eine "Bildlaufansicht" ersetzte, lief das Bild gut. Nur damit jemand stolpert.

Ich bin mir nicht sicher, ob das die Arbeit stoppen sollte, da ich sehr unerfahren bin, aber es schien meine Lösung zu sein. Hoffe es hilft jemandem.

0
Steve