UIScrollView Scrollable Content Size Ambiguity


511

Compagni, ho problemi con AutoLayout in Interface Builder (Xcode 5 / iOS 7). È molto semplice e importante, quindi penso che tutti dovrebbero sapere come funziona correttamente. Se questo è un bug in Xcode, è critico!

Quindi, ogni volta che ho una gerarchia di viste come questa, ho dei problemi:

>UIViewController
>> UIView
>>>UIScrollView
>>>>UILabel (or any other comparable UIKit Element)

UIScrollView ha vincoli solidi, ad esempio 50 px da ogni lato (nessun problema). Quindi aggiungo un vincolo Top Space a UILabel (nessun problema) (e posso persino fissare l'altezza / larghezza dell'etichetta, non cambia nulla, ma dovrei essere inutile a causa delle dimensioni intrinseche dell'etichetta)

Il problema inizia quando aggiungo un vincolo finale a UILabel:

Ad esempio, Trailing Space to: Superview Equals: 25

Ora vengono visualizzati due avvisi e non capisco perché:

A) Ambiguità della dimensione del contenuto scorrevole (Vista scorrimento ha altezza / larghezza del contenuto scorrevole ambiguo)

B) Viste fuori posto (etichetta prevista: x = -67 effettiva: x = 207

Ho fatto questo esempio minimo in un nuovo progetto che puoi scaricare e ho allegato uno screenshot. Come puoi vedere, Interface Builder si aspetta che l'etichetta si trovi al di fuori del confine di UIScrollView (il rettangolo tratteggiato arancione). L'aggiornamento del frame dell'etichetta con lo strumento Risolvi problemi lo sposta proprio lì.

Nota: se si sostituisce UIScrollView con un UIView, il comportamento è come previsto (il frame dell'etichetta è corretto e in base al vincolo). Quindi sembra che ci sia un problema con UIScrollView o mi sto perdendo qualcosa di importante.

Quando eseguo l'app senza aggiornare il frame dell'etichetta come suggerito da IB, si posiziona perfettamente, esattamente dove dovrebbe essere e UIScrollView è scorrevole. Se aggiorno il riquadro, l'etichetta non è visibile e UIScrollView non scorre.

Aiutami Obi-Wan Kenobi! Perché il layout ambiguo? Perché la visione fuori posto?

Puoi scaricare il progetto di esempio qui e provare se riesci a capire cosa sta succedendo: https://github.com/Wirsing84/AutoLayoutProblem

Illustrazione del problema in Interface Builder


8
Prova a posizionare UILabel in una vista del contenuto, quindi imposta il bordo posteriore dell'etichetta sulla vista del contenuto (UIView normale). Questo video può esserti di grande aiuto: youtube.com/watch?v=PgeNPRBrB18&feature=youtu.be
erdekhayser

1
Ottimo video ma non ha riparato gli avvisi per me. :(
Mr Rogers,

Grazie mille per il video - c'è stato (piuttosto sorprendentemente) parecchio che ho imparato da esso! Tuttavia, quando combino la conoscenza del video con stackoverflow.com/questions/18953617/… posso correggere gli avvisi. La domanda che rimane è: come rendere le dimensioni del contenuto di scrollViewViewView solo le dimensioni necessarie?
Wirsing

Dai un'occhiata a questo video. Viene illustrato come utilizzare UIScrollLayout e autolayout con XCode 5 / iOS 7.
jaxvy,

Il mio consiglio è di non usare UIScrollViewdirettamente. Invece usa UICollectionViewo UITableViewil più possibile, quasi tutto è possibile con questi elementi e dà anche semplicità, leggibilità e riusabilità !!!
Spatel,

Risposte:


1093

Quindi ho appena risolto in questo modo:

  1. All'interno UIScrollView dell'aggiunta a UIView(possiamo chiamarlo così contentView);

  2. In questo contentView, imposta i margini superiore, inferiore, sinistro e destro su 0 (ovviamente da scrollViewquale è il superView); Impostare anche allineare il centro in orizzontale e in verticale ;

Finito .

Ora puoi aggiungere tutte le tue visualizzazioni in questo contentViewe il contentSizesimbolo del scrollViewverrà automaticamente ridimensionato in base a contentView.

Aggiornare:

Alcuni casi speciali sono coperti da questo video pubblicato da @Sergio nei commenti qui sotto.


33
Quasi perfetto, tranne per il fatto che la vista di scorrimento non può più indovinare la lunghezza del contenuto e ridimensionare di conseguenza è contentSize per adattarsi agli oggetti all'interno. Ho una vista tabella all'interno di contentView la cui altezza cambia (tramite vincolo) e la vista di scorrimento non mi consente di scorrere.
CyberMew,

28
Forse questo video può aiutare a superare tutti i problemi rimanenti.
Sergio,

46
questo non lo fa scorrere.
Dorian,

2
@MatteoGobbi Questo è tutto! Ha fatto il trucco! Sono stato alle prese con questo tipo di problemi di scrollView autoLayout follia per 2 giorni .... Grazie amico !!!
polo987,

56
Per chiunque si trovi di fronte a problemi con ScrollView non scorrevole, l'impostazione del contenuto in basso e l'allineamento verticale dei vincoli con priorità bassa hanno fatto il trucco per me!
jimmy0251,

98

Questo errore mi ha richiesto un po 'di tempo per rintracciarlo, inizialmente ho provato a fissare la dimensione di ScrollView ma il messaggio di errore indica chiaramente "dimensione del contenuto". Mi sono assicurato che tutto ciò che avevo appuntato dalla parte superiore di ScrollView fosse bloccato anche nella parte inferiore. In questo modo ScrollView può calcolare la sua altezza del contenuto trovando l'altezza di tutti gli oggetti e vincoli. Ciò ha risolto l'altezza ambigua del contenuto, la larghezza è abbastanza simile ... Inizialmente avevo la maggior parte delle cose centrate su X in ScrollView, ma dovevo anche bloccare gli oggetti sul lato di ScrollView. Non mi piace perché l'iPhone6 ​​potrebbe avere uno schermo più ampio ma rimuoverà l'errore "ambiguous content width".


31
La ringrazio per la risposta! Se ti capisco correttamente, riesci a rimuovere l'errore bloccando ogni sottoview in ScrollView in alto e in basso. Tuttavia, questo non è necessario. Devi solo assicurarti che ci sia un modo per creare una linea continua di vincoli dall'alto verso il basso della vista di scorrimento. [-XXX] Spero fosse comprensibile;>
Wirsing il

1
Come risolvere il problema se la vista ha un'altezza variabile? Come posso impostare i vincoli in modo che la vista di scorrimento possa calcolare le dimensioni?
hashier,

2
'Devi solo assicurarti che ci sia un modo per creare una linea continua di vincoli dall'alto verso il basso della vista di scorrimento' <- grazie per quella frase
Adam Waite,

3
Ciò che mi ha aiutato è stato assicurarmi che la vista di scorrimento fosse fissata alla superview e non alle guide di layout superiore o inferiore. Ho rimosso il vincolo per la guida di layout in basso e ho eseguito il menu anziché il builder di interfacce. Editor -> Pin -> Spazio inferiore alla supervisione.
Alberto Lopez,

2
Se si desidera che la larghezza della vista di scorrimento segua la larghezza dello schermo del telefono o qualsiasi altro elemento nell'interfaccia utente (come UIView contenente), è necessario impostare "uguale larghezza" su di essa utilizzando un altro elemento esterno alla vista di scorrimento per misura.
Departamento B,

89

Xcode 11+

Il modo più semplice usando autolayout:

  1. Aggiungi UIScrollViewe 0,0,0,0appuntalo alla superview (o alla dimensione desiderata)
  2. Aggiungi UIViewin ScrollView, appuntalo 0,0,0,0su tutti e 4 i lati e centralo horizontallye vertically.
  3. In Impostazioni dimensioni, modifica bottome align center Ypriorità su 250. (per cambio scorrimento orizzontale trailinge align center X)
  4. Aggiungi tutte le viste necessarie in questa vista. Non dimenticare di impostare il vincolo inferiore sulla vista più bassa.
  5. Seleziona UIScrollView, seleziona Impostazioni dimensioni e deseleziona Content Layout Guides.

1
Non sono riuscito a impostare l'altezza del contenuto di scrollview ma funziona. :)
Blind Ninja,

2
Suggerimento: da parte mia ha funzionato solo se ho rimosso il centro in orizzontale e in verticale e lo sostituivo con uguale larghezza (scrollView + view inside scrollView) E aggiungendo l'altezza in base al contenuto, il che significa che l'ultimo elemento della vista necessita di un vincolo inferiore. Guardate qui per maggiori informazioni: stackoverflow.com/a/54577278/5056173
Sean Stayns

1
Sean, lo sto usando letteralmente ogni giorno e non ho mai avuto problemi con questo approccio quando si tratta di scorrimento verticale e orizzontale. Forse hai dimenticato di mettere un vincolo inferiore sull'elemento più basso / ultimo. Senza quello, questo non funzionerà.
Đorđe Nilović,

7
Punto numero 4: la seconda frase è quella più grande.
Nitish,

2
questa risposta ha funzionato perfettamente per me
satvinder singh

63

È la risposta alla mia domanda con risposta automatica UIScrollView + Visualizzazione centrata + Dimensione contenuto scorrevole e ambiguo + molte dimensioni di iPhone .

Ma copre anche il tuo caso!

Quindi, ecco lo stato iniziale per il caso più semplice:

  1. scrollView con 0 vincoli per tutti i bordi
  2. Pulsante centrato orizzontale e verticale con vincoli di larghezza e altezza fissi
  3. E, naturalmente, avvertimenti fastidiosi Has ambiguous scrollable content width e Has ambiguous scrollable content height.

1

Tutto quello che dobbiamo fare è:

  • Aggiungi 2 ulteriori vincoli, ad esempio "0" per il trailing e / o lo spazio inferiore per la nostra vista (guarda l'esempio nella schermata qui sotto).

Importante: devi aggiungere vincoli finali e / o inferiori . Non "leader e superiore" - non funziona!

2

Puoi verificarlo nel mio esempio di progetto , che dimostra come risolvere questo problema.

PS

Secondo la logica - questa azione dovrebbe causare "vincoli contrastanti". Ma no!

Non so perché funzioni e in che modo Xcode rilevi quale vincolo ha la priorità maggiore (perché non ho impostato la priorità per la chiarezza di questi vincoli). Sarò grato se qualcuno spiegherà, perché funziona nei commenti qui sotto.


Ottimo consiglio! Ho finito per creare un vincolo al limite inferiore e impostare la priorità su medio o basso
Decano

Wow! Questo sul serio non ha alcun senso ma funziona! Grazie! L'ultimo elemento che ho a mio avviso ho impostato un vincolo inferiore di 0 e BANG. Finalmente ha funzionato.
Jakob Hviid,

60

Xcode 11+, Swift 5

Se ti stai chiedendo perché tutte le risposte non funzionano più, assicurati di aver bloccato la vista del contenuto (quella che hai inserito nella vista di scorrimento) alla Guida al layout del contenuto della vista di scorrimento e NON alla Guida al layout del telaio.

I bordi della vista del contenuto (in primo piano, in coda, in alto, in basso) non devono essere bloccati come in cima all'immagine - alla Guida al layout della cornice

Non così

ma in questo modo - alla Guida al layout dei contenuti.

Seleziona Guida al layout dei contenuti dal menu a discesa

inserisci qui la descrizione dell'immagine

E quindi la maggior parte delle risposte funzionerà per te.

L'approccio più semplice ora sta andando così:

  1. Inserisci la vista di scorrimento nella vista principale
  2. Appunta tutti i lati della vista di scorrimento alla superview
  3. Prendi un'altra UIView (la chiamerà visualizzazione contenuto) e inseriscila nella vista di scorrimento
  4. Appunta tutti i lati della vista del contenuto per scorrere la Guida al layout del contenuto della vista
  5. Appunta la larghezza della vista del contenuto in modo che sia uguale alla Guida al layout della cornice della vista di scorrimento
  6. Correggi l'altezza della vista del contenuto nel modo desiderato (ho usato solo un vincolo di altezza costante nell'esempio seguente)

Nel complesso la tua struttura nell'implementazione più semplice sarà simile a questa

inserisci qui la descrizione dell'immagine


@WantToKnow Non c'è bisogno di prendere il vincolo per l'altezza, basta cambiare la sua priorità in bassa (250)
Reckoner

Xcode 11+, Swift 5. Secondo la risposta di @WantToKnow, ho risolto il mio problema, ho preparato [video] [1] e [code] [2] [1]: youtube.com/watch?v=qMrH5_Yj5hM [2]: github.com/AhmAbdallah/CustomCollectionView
Ahmed Abdallah

1
Questa è un'ottima risposta, grazie.
Costantino

1
Questa è la risposta esatta. Grazie.
Vincent Joy,

Questo ha funzionato per me solo quando ho aggiunto il vincolo inferiore all'ultimo elemento della visualizzazione contenuto
D.Zotov,

49

Devi creare un UIViewsottoview UIScrollViewcome descritto di seguito:

  • UIViewController
  • UIView "Vista principale"
    • UIScrollView
      • UIView "Vista contenitore"
        • [I tuoi contenuti]

Il secondo passo è quello di rendere i UIScrollViewvincoli. L'ho fatto con i vincoli superiore, inferiore, iniziale e finale del suo superView.

Successivamente ho aggiunto i vincoli per il contenitore di UIScrollViewe qui è dove inizia il problema. Quando inserisci gli stessi vincoli (in alto, in basso, in testa e in coda) lo Storyboard dà un messaggio di avviso:

"Ha una larghezza del contenuto scorrevole ambigua" e "Ha una altezza del contenuto scorrevole ambigua"

Continua con gli stessi vincoli di cui sopra e aggiungi semplicemente i vincoli Equal Heighte Equal Widthalla vista contenitore in relazione alla vista principale e non alla tua UIScrollView. In altre parole, i vincoli della vista contenitore sono legati alla UIScrollViewsuperview della vista.

Dopodiché non avrai avvisi nel tuo Storyboard e puoi continuare ad aggiungere i vincoli per le tue sottoview.


2
D'accordo - Penso che l'aggiunta di una vista contenitore sia la soluzione migliore e più gestibile.
Andrew Ebling,

1
Questa soluzione funzionerà quando non hai una barra di navigazione da gestire.
Leena,

27

Ho avuto lo stesso problema. Deseleziona questa casella di controllo. Dal momento che stai impostando la dimensione del contenuto nel codice. inserisci qui la descrizione dell'immagine


24

Alla fine l'ho capito, spero che sia più facile da capire.

È spesso possibile ignorare tale avviso aggiungendo una vista UIV di base alla vista di scorrimento come "vista contenuto", in quanto menzionata e resa della stessa dimensione della vista di scorrimento e, in questa vista del contenuto, impostare questi 6 parametri.

inserisci qui la descrizione dell'immagine

Come puoi vedere, hai bisogno di 6 parametri totali! Quale ... in circostanze normali, stai duplicando 2 vincoli ma questo è il modo per evitare questo errore dello storyboard.


1
Quanto sopra ha funzionato quasi per me, poiché sono preoccupato per 3 diverse larghezze dello schermo (4/5, 6, 6+) ho impostato la vista del contenuto e la vista di scorrimento per avere uguale larghezza. Hai ragione, è un duplicato perché ho già detto alla vista del contenuto di avere 0 spazi iniziali e finali.
Stuart P.

8
È possibile impostare uguali vincoli di larghezza e altezza dalla vista del contenuto alla vista di scorrimento, anziché valori costanti. Questo funzionerà su tutte le risoluzioni.
Kumar C,

Devo implementare lo stesso, quindi puoi aiutarmi a impostare l'altezza e la larghezza uguali sia per la vista del contenuto che per la vista di scorrimento?
Urmi,

Potrebbe valere la pena verificare se è ancora necessario farlo. Di recente ho impostato un imageView in una vista di scorrimento e sono riuscito a cavarmela impostando solo i 4 vincoli mostrati in alto per far scomparire l'errore in Xcode 8.3
William T.

1
@Honey questo è stato pubblicato più di 3 anni fa. Da allora hanno decisamente migliorato gli storyboard. Anch'io ho notato che puoi scappare senza la visualizzazione del contenuto ora. Aggiusterò la mia risposta.
William T.

16

So che potrei essere in ritardo, ma la prossima soluzione risolve questo tipo di problemi senza codice aggiuntivo , usando solo gli storyboard:

Per la visualizzazione del contenuto è necessario impostare i vincoli per gli spazi iniziale / finale / superiore / inferiore per la visualizzazione a scorrimento e ciò non cambierà il riquadro di visualizzazione del contenuto , in questo modo:inserisci qui la descrizione dell'immagine

Naturalmente è necessario creare ulteriori vincoli per la visualizzazione del contenuto in modo che la vista di scorrimento possa conoscere le dimensioni del contenuto. Ad esempio impostare altezza fissa e centro x.

Spero che sia di aiuto.


7

Per me l'aggiunta di un contentViewnon ha funzionato davvero come suggerito. Inoltre, crea un overhead a causa della vista aggiunta (anche se non lo considero un grosso problema). Ciò che ha funzionato meglio per me è stato semplicemente disattivare il controllo dell'ambiguità per il mio scrollView. Tutto sta andando bene, quindi penso che vada bene in casi semplici come il mio. Ma tieni presente che se altri vincoli per la tua scrollViewpausa, Interface-Builder non ti avvertirà più a riguardo.

inserisci qui la descrizione dell'immagine


5
Questo rimuoverà solo l'avvertimento e non farà nulla per risolvere il problema.
Predrag Manojlovic,

Voi. siamo. mio. eroe. Non me ne sono reso conto e sono felice di trovarlo! Ho provato "Verifica solo posizione" che ti aspetteresti, non so, verifica solo la posizione, ma no consente anche questo problema di "dimensioni del contenuto" errato. Devo andare con "Never Verify". Grazie!
Dustin,

Penso che questa sia la risposta giusta se stai creando la vista figlio a livello di codice. Grazie!
Florian Kusche,


3

Vedi sotto: visualizzazione contenuto in scrollview verticale e orizzontale centralizzata. hai riscontrato un errore di ambiguità, assicurati sempre che due aggiunti alla vista di scorrimento dalla vista del contenuto siano 1) .button space to container.2) spazio finale per il vincolo che è evidenziato nello screenshot,

questi vincoli indicano in scorrimento quanto è possibile scorrere dopo l'altezza o la larghezza della vista del contenuto.

inserisci qui la descrizione dell'immagine

può aiutarti.


3

Ho risolto questo tipo di problema per la mia vista utilizzando "Risolvi problemi di layout automatico"> "Aggiungi vincoli mancanti" per la vista selezionata inserisci qui la descrizione dell'immagine

I seguenti due vincoli risolvono il mio problema:

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

in cui: trailing, bottom sono i trailing, bottom di UIScrollView


Questo ha funzionato per me aggiungendo un vincolo "in fondo". Ora che ci penso, ha perfettamente senso.
SilverWolf - Ripristina Monica il

3

Utilizzando contentView ( UView) come contenitore interno UIScrollView, bastone bordi ( top, bottom, trailing, leading) di superview ( UIScrollView) e contentViewdovrebbe avere equalwidthe equalheightdi superview. Questi sono vincoli. E chiamata del metodo:

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.scrollView.contentSize = self.contentView.frame.size;
}

Risolti problemi per me.


3

Approccio Swift 4+:

1) Impostare i margini superiore, inferiore, sinistro e destro di UIScrollView su 0

2) All'interno di UIScrollView aggiungi una UIView e imposta i margini superiore, inferiore, iniziale e finale a 0 (uguale ai margini di UIScrollView).

3) La parte più importante è impostare la larghezza e l'altezza, dove il vincolo di altezza dovrebbe avere una bassa priorità .

private func setupConstraints() {

    // Constraints for scrollView
    scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
    scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

    // Constraints for containerView
    containerView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
    containerView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
    containerView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
    containerView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
    containerView.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true

    let heightConstraint = containerView.heightAnchor.constraint(equalTo: scrollView.heightAnchor)
    heightConstraint.priority = UILayoutPriority(rawValue: 250)
    heightConstraint.isActive = true
}

2

La risposta di @Matteo Gobbi è perfetta, ma nel mio caso la vista di scorrimento non può scorrere, rimuovo "Allinea centro Y " e aggiungo " altezza> = 1 ", la vista di scorrimento diventerà scorrevole


2

Le persone che stanno lottando con uiscrollview senza scorrere impostano semplicemente il vincolo inferiore della visualizzazione del contenuto con il layout inferiore dell'ultima visualizzazione (che si trova all'interno della visualizzazione del contenuto). Non dimenticare di rimuovere il vincolo Y centrale.

Riposo tutti i vincoli sono gli stessi definiti sopra. Scrollview si preoccupava solo di ottenere la massima altezza dalla sua vista del contenuto e lo stiamo impostando come vincolo inferiore dell'ultima vista, il che significa che scrollview cambierà automaticamente la sua compensazione del contenuto.

Nel mio caso l'ultima vista era UILable con no of lines proprietà = 0 (che regola automaticamente la sua altezza in base al suo contenuto), quindi aumenta dinamicamente l'altezza di uilable e alla fine la nostra area scorrevole aumenta a causa del layout inferiore di uilable è allineato con il fondo della nostra vista di contenuto, che forza scrollview per aumentare il suo offset del contenuto.


2

Ho realizzato un video su
YouTube Scroll StackViews utilizzando solo Storyboard in Xcode

Penso che qui possano apparire 2 tipi di scenari.

La vista all'interno di scrollView -

  1. non ha alcun contenuto intrinseco Dimensione (ad es. UIView)
  2. ha il suo contenuto intrinseco Dimensione (ad es. UIStackView)

Per una vista scorrevole verticalmente in entrambi i casi è necessario aggiungere questi vincoli:

  1. 4 vincoli dall'alto, a sinistra, in basso e a destra.

  2. Uguale larghezza per scrollview (per interrompere lo scorrimento in orizzontale)

Non sono necessari altri vincoli per le viste che hanno la propria altezza del contenuto intrinseco.

inserisci qui la descrizione dell'immagine


Per le viste che non hanno un'altezza del contenuto intrinseca, è necessario aggiungere un vincolo di altezza. La vista scorrerà solo se il vincolo di altezza è superiore all'altezza di scrollView.

inserisci qui la descrizione dell'immagine


2
import UIKit

class ViewController: UIViewController {

    //
    let scrollView: UIScrollView = {

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

    let lipsumLbl: UILabel = { // you can use here any of your subview

        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.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).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
    }
}

Produzione:

inserisci qui la descrizione dell'immagine


perché hai bisogno di condurreAncora quando hai già lasciatoAncora?
ShadeToD,

leftAnchor non può essere utilizzato per questo scopo, quindi dobbiamo usare LeadAnchor per raggiungere lo stesso ..
iAj

hai usato entrambi nel tuo esempio.
ShadeToD

@ShadeToD fammi controllare
iAj

2

Nel mio caso ho ricevuto il problema di dimensioni errate del contenuto e ambiguità delle dimensioni del contenuto in iPad, ma funzionava in caso di iPhone. Ho apportato le seguenti modifiche allo storyboard per risolvere il problema.

  1. Aggiungi scrollview in UIView e aggiungi i vincoli lead, top, trailing e bottom a 0,0,0,0.
  2. Impostare l'altezza della vista di scorrimento secondo i requisiti per es. 100.
  3. Aggiungi UIView per scorrere la vista e aggiungere vincoli iniziali, superiori, finali e inferiori a 0,0,0,0 e allinea i vincoli centrale (X) e centrale (Y).
  4. Deseleziona "Guide layout contenuto" nella finestra di ispezione delle dimensioni della vista di scorrimento.

1

Scorrimento verticale

  1. Aggiungi un UIScrollView con vincoli 0,0,0,0 alla superview.
  2. Aggiungi un UIView in ScrollView, con vincoli 0,0,0,0 a superview.
  3. Aggiungi lo stesso vincolo di larghezza per UIView a UIScrollView.
  4. Aggiungi altezza a UIView.
  5. Aggiungi elementi con vincoli a UIView.
  6. Per l'elemento più vicino al fondo, assicurati che abbia un vincolo al fondo di UIView.

0

Quello che ho fatto è stato creare una vista del contenuto separata, come mostrato qui.

La visualizzazione del contenuto è a forma libera e può avere tutte le visualizzazioni secondarie aggiunte con i propri vincoli in relazione a contentView.

UIScrollView viene aggiunto al controller della vista principale.

A livello di programmazione aggiungo il contentView che è collegato tramite IBOutlet alla classe e imposto il contentView di UIScrollView.

UIScrollView con ContentView tramite Interface Builder


0

Stavo ottenendo lo stesso errore .. ho fatto seguendo

  1. Vista (Superview)
  2. ScrollView 0,0.600.600
  3. UIView dentro ScrollView: 0,0.600.600
  4. UIView contiene vista immagine, etichetta

Ora aggiungi lead / trailing / top / bottom per scrollView (2) quindi UIView (3).

Seleziona Visualizza (1) e Visualizza (3) impostando ugualmente altezza e peso .. il mio problema è stato risolto.

Ho realizzato il video che aiuterà:

https://www.youtube.com/watch?v=s-CPN3xZS1A


0

[testato in XCode 7.2 e per iOS 9.2]

Ciò che ha soppresso gli errori e gli avvisi di Storyboard per me è stato impostare la dimensione intrinseca della vista di scorrimento e della vista del contenuto (nel mio caso, una vista pila) su Segnaposto . Questa impostazione si trova nella finestra di ispezione Dimensione in Storyboard. E dice - L'impostazione di un tempo di progettazione delle dimensioni intrinseche del contenuto influisce solo su una vista durante la modifica in Interface Builder. La visualizzazione non avrà questa dimensione intrinseca del contenuto in fase di esecuzione.

Quindi, suppongo che non sbaglieremo impostando questo.

Nota: nello storyboard, ho bloccato tutti i bordi di scrollview alla superview e tutti i bordi di stackview alla scrollview. Nel mio codice, ho impostato translatesAutoresizingMaskIntoConstraints su false sia per scrollview che per stackview. E non ho menzionato una dimensione del contenuto. Quando lo stackview cresce dinamicamente, i vincoli impostati nello storyboard assicurano che lo stack sia scorrevole.

L'avvertimento dello storyboard mi stava facendo impazzire e non volevo centrare le cose orizzontalmente o verticalmente solo per sopprimere l'avvertimento.


0

Se qualcuno sta riscontrando un comportamento in cui noti la barra di scorrimento sulla destra scorre ma il contenuto non si sposta, questo fatto probabilmente vale la pena considerare:

È inoltre possibile utilizzare i vincoli tra il contenuto della vista di scorrimento e gli oggetti all'esterno della vista di scorrimento per fornire una posizione fissa per il contenuto della vista di scorrimento, facendo apparire tale contenuto fluttuante sulla vista di scorrimento.

È dalla documentazione di Apple . Ad esempio, se hai accidentalmente appuntato la tua etichetta / pulsante / immagine / vista in alto alla vista al di fuori dell'area di scorrimento (forse un'intestazione o qualcosa appena sopra lo scrollView?) Invece di contentView, congeleresti l'intero contenutoView in posizione.


0

Come menzionato nelle risposte precedenti, è necessario aggiungere una vista personalizzata all'interno della vista di scorrimento:

La vista personalizzata è ContentView contrassegnato nell'immagine

Aggiungi tutte le tue visualizzazioni secondarie alla visualizzazione dei contenuti. Ad un certo punto vedrai una visualizzazione del contenuto a scorrimento con un avviso di dimensioni del contenuto ambiguo, è necessario selezionare la visualizzazione del contenuto e fare clic sul pulsante "Risolvi problemi relativi al layout automatico" (nell'angolo in basso a destra del layout IB), quindi selezionare "Aggiungi mancante vincoli "opzione.

inserisci qui la descrizione dell'immagine

D'ora in poi, quando avvierai il progetto, la vista di scorrimento aggiornerà automaticamente la dimensione del suo contenuto, senza bisogno di codice aggiuntivo.


0

Devi solo assicurarti che ci sia un modo per creare una linea continua di vincoli dall'alto verso il basso della vista di scorrimento. [-XXX]

Nel mio caso - una vista di scorrimento a scorrimento orizzontale - avevo anche bisogno di aggiungere vincoli di larghezza e altezza per ogni figlio della vista di scorrimento, sebbene la nota tecnica di Apple non lo dica.



0

Se hai ancora problemi con UIScrollView, disattiva le Guide layout contenuto (Seleziona il tuo ScrollView in xcode Interface Builder -> scegli Impostazioni dimensioni nel pannello a destra -> deseleziona 'Guide layout contenuto') O prova questi passaggi: xcode 11 scorri layout layout - può essere utile per il nuovo stile di layout. Funziona bene su macOS 10.15.2, Xcode 11.3.1, per 05.02.2020

vedi screenshot


0

Utilizzo di Autolayout

Aggiungi la vista di scorrimento all'interno di una vista ben definita e quindi aggiungi la vista dello stack all'interno della vista di scorrimento

Aggiungi i vincoli in alto, a sinistra, a destra, in basso, al centro X e al centro Y dalla vista a scorrimento e dalla vista in pila alle rispettive super viste

Assicurati che i vincoli siano collegati dalla vista dello stack alla superview legittima (vista di scorrimento) poiché l'impostazione predefinita corrente prevede l'aggiunta di un vincolo Allinea in alto e non di uno spazio in alto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.