web-dev-qa-db-fra.com

Swift - UIScrollView ne défile pas

Mon UIScrollView ne défilera pas. Je ne sais pas pourquoi. J'ai déjà suivi la documentation Apple concernant ce problème.

@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)
}

S'il vous plaît donnez votre avis. Je vous remercie.

26
Mohammad Nurdin

Vous devez définir la frame de votre UIScrollView afin qu'elle soit inférieure à la contentsize. Sinon, il ne défilera pas.

De même, je vous recommanderais d’ajouter scroller.contentSize = CGSizeMake(400, 2300) à votre méthode viewDidLoad.

39
Christian

Bien souvent, le code est correct si vous avez suivi un tutoriel, mais ce que beaucoup de débutants ne savent pas, c’est que scrollView ne défile PAS normalement dans le simulateur. Il est supposé faire défiler uniquement lorsque vous appuyez sur le tapis de souris et faites défiler simultanément. Beaucoup d'utilisateurs expérimentés en XCode/Swift/Obj-C sont habitués à le faire et ne savent pas comment les débutants pourraient l'ignorer. 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)
}

Ce code fonctionnera parfaitement tant que vous ferez ce que j'ai dit plus haut

12
flo527

Version Swift 3.0

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

Si vous utilisez autolayout, la propriété contentSize cesse de fonctionner et tente de déduire la taille du contenu à partir des contraintes. Si tel est le cas, votre problème peut être que vous ne définissez pas les contraintes nécessaires à la vue de contenu afin que la vue de défilement puisse déduire la taille du contenu . Vous devez définir les contraintes de votre vue de contenu en haut et en bas. bords de la vue de défilement.

3
Carlos Compean

Si vous utilisez AutoLayout,

Définissez la taille du contenu dans viewdidAppear qui fonctionne pour moi.

redéfinit func viewDidAppear (_ animé: Bool) {

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

}
2
satheesh

Je ne sais pas si c’est une bonne solution, mais vous pouvez essayer de définir l’aperçu principal pour qu'il vide UITableView.

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

tableView.tableHeaderView = scrollView
2
gellezzz

La vue peut sembler ne pas s’abaisser pour deux raisons, car votre code est parfaitement sonore.

  • Première raison, vous ne voyez pas l'indicateur de défilement
  • Deuxième raison, rien à afficher dans la vue

La deuxième raison ne suffit pas pour dire que votre vue ne défile pas, mais si vous ne voyez pas l'indicateur de défilement, vous pourriez alors croire que la vue ne défile pas alors qu'elle le fait.

La première raison que je vois se produit lorsque les contraintes ne sont pas définies dans le storyboard, en particulier si la taille du contrôleur de vue dans le storyboard est définie sur "N'importe lequel". La vue de défilement serait plus large que l’écran du dispositif simulé ou réel et l’indicateur de défilement serait donc en dehors de l’écran visible.

0
Tokuriku

Dans mon cas, j'ai utilisé UIStackView dans UIScrollView. 

Ajout de quelques vues-éléments du code à stackview . Il ne défilera pas.

Corrigé en définissant userInteractionEnabled de stackview à false

0

J'ai eu des problèmes avec cela et je ne pouvais pas trouver de réponse avant d'avoir résolu le problème. J'avais une vue de défilement à l'intérieur d'une vue normale et dès que j'ai remplacé la "vue" par une "vue de défilement", elle a bien défilé. Juste au cas où quelqu'un trébuche sur cela.

Je ne suis pas sûr que cela ait été fait pour l'empêcher de fonctionner car je suis très inexpérimenté, mais cela semblait être ma solution. J'espère que ça aide quelqu'un.

0
Steve