UIScrollView non utilizza i vincoli di autolayout

Ho una vista di scorrimento e una vista di immagine dietro di esso e lo sto popolando con pennini. Sto usando l’autolayout. Ho uno spazio di fondo per superview e uno spazio superiore per superview su entrambe le viste. La vista dell’immagine fa esattamente ciò che voglio che faccia. Per iphone 5 è dove lo voglio. E per gli altri iPhone, rimane sopra la parte inferiore dello schermo, quindi viene ridimensionato correttamente. La vista di scorrimento appare direttamente sull’iPhone 5, ma sugli altri telefoni non viene ridimensionata, quindi scorre sotto la vista dell’app. Ottengo questi messaggi nel registro:

2012-11-21 10:42:38.576 LCHApp[12604:907] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) "", "", "", "", "" Will attempt to recover by breaking constraint  

Ho già provato

 [self setTranslatesAutoresizingMaskIntoConstraints:YES]; 

e

 [self.myScrollView setTranslatesAutoresizingMaskIntoConstraints:YES]; 

Da quello che posso vedere, questo toglie tutti i vincoli dalle viste. E non è quello che voglio.

La relazione tra UIScrollView e il layout automatico è diversa da altri aspetti del layout automatico. Fondamentalmente, se il semplice layout automatico era autorizzato a funzionare, non si poteva scorrere. Ad esempio, se una visualizzazione secondaria della vista di scorrimento fosse bloccata in modo normale da un vincolo a 10 punti dalla parte superiore della vista di scorrimento, sarebbe assolutamente bloccata lì; non si sposterebbe mai, indipendentemente da come si scorreva la vista di scorrimento.

Per risolvere questo problema, un UIScrollView che utilizza l’autolayout funziona in un modo completamente nuovo. Quindi quando dici “Sto usando l’autolayout” devi prepararti affinché le cose funzionino in modo molto diverso da prima. È necessario utilizzare una visualizzazione di sottomenu a scorrimento singola con translatesAutoresizingMaskIntoConstraints = YES e una dimensione del contenuto esplicita, oppure tutto deve avere translatesAutoresizingMaskIntoConstraints = NO e la dimensione del contenuto verrà dedotta in modo implicito in base ai vincoli delle sottoview.

Questo è molto ben spiegato in https://developer.apple.com/library/content/releasenotes/General/RN-iOSSDK-6_0/index.html

Molto importante quando si utilizza il layout automatico: è necessario posizionare il lato destro e / o il lato inferiore dell’ultima visualizzazione secondaria a destra e / o in basso nella vista di scorrimento. Questo è il modo in cui la vista di scorrimento conosce la dimensione del contenuto. Per esempio:

 [scrollView addConstraint:[NSLayoutConstraint constraintWithItem:lastSubView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeRight multiplier:1.0 constant:0]]; 

I miei ringraziamenti a questo sito per fornire l’esempio perfetto.

Ho perso ore a causa di questo, e spero di risparmiare ad altri il mio dolore.

Per far sì che UIScrollviews funzioni bene con i vincoli, utilizzo qui questo approccio. In questa risposta, affronto come ottenere un scrollview verticalmente funzionante che funzioni anche con la rotazione del dispositivo. Puoi modificare l’approccio per lavorare anche con le immagini a scorrimento orizzontale . Per le visualizzazioni di scorrimento che scorrono in entrambe le direzioni, non aggiungere il trucco del vincolo della larghezza della corrispondenza delle dimensioni. Ma fai tutto il resto allo stesso modo.

Un paio di cose

  1. assicurati che l’autolayout sia attivo (IB nella “Scheda File Inspector”)
  2. Assicurati di NON apportare modifiche che coinvolgono limiti, frame, ecc. – questo è tutto fatto dai vincoli Auto ora
  3. Assicurati di stare lontano da AutoResizingMask. Questo sarà in concorrenza con le tue nuove impostazioni. Se questi sono fatti bene, ora puoi impostare il tuo pulsante e funzionerà alla grande. Ecco come.

Questo errore sta affermando che il pennino o un controllo all’interno di quel pennino NON sta utilizzando il layout automatico.