2012-08-30 12 views
8

Ho un pennino con l'autolayout abilitato contenente le viste di un controller di visualizzazione e, separatamente, una finestra con una vista segnaposto per aggiungerle. Il segnaposto ha vincoli relativi alla sua superview e ad altre viste nella finestra, e prima di coinvolgere il mio controller di visualizzazione, ho il ridimensionamento del segnaposto con la finestra nel modo che voglio. Successivamente carico il pennino e aggiungo la sua vista di primo livello come sottoview del segnaposto, e creo anche manualmente i vincoli per tenerlo allineato ai bordi del segnaposto.Autolayout sta ridimensionando la mia finestra

Tutto bene, e sto usando questo modello in diverse istanze all'interno della mia app, ma in alcuni di questi casi, dopo aver aggiunto la vista la mia finestra viene ridimensionata! Si sta riducendo alle dimensioni minime per la vista aggiunta invece che alla vista che si espande alla dimensione corrente della finestra.

Finora l'unico modo che ho trovato per evitare questo è che quando si aggiunge la vista e si creano i suoi vincoli, si imposta anche il frame della vista per dargli la dimensione iniziale per lo stato corrente del segnaposto e della finestra. Va bene una parte del tempo, ma voglio essere in grado di definire i vincoli che sono più complicati che semplicemente allineando ogni spigolo a una superview di segnaposto. Non voglio codificare l'aritmetica dei frame per ognuno di questi casi.

Qualcuno sa cosa sta succedendo? Se la finestra sta già dettando le dimensioni del mio segnaposto, e non viceversa, cosa devo fare quando aggiungo la sottoview per fare in modo che le attuali dimensioni della finestra abbiano ancora la precedenza?

Ho visto il menu di scelta rapida nelle finestre IB di Xcode che sembra riguardare vincoli che riguardano solo le sottoviste e anche superview (impostato sul primo per tutti i miei pennini), cosa sta succedendo in relazione a questa funzionalità? Non ho ancora trovato nulla al riguardo.

+0

Non puoi semplicemente impostare un vincolo di larghezza sulla visualizzazione personalizzata (segnaposto)? – codingFriend1

+1

Ho modificato il mio post per renderlo più chiaro, spero. Il mio segnaposto ha già dei vincoli per dargli il giusto comportamento durante il ridimensionamento della finestra. L'aggiunta di vincoli di dimensione fissa ad esso quando si aggiunge la sottoview interromperà. –

+0

Se i tuoi vincoli sono corretti, il ridimensionamento della finestra funzionerebbe. –

risposta

9

Si desidera impostare la priorità della resistenza di compressione su un valore inferiore a NSLayoutPriorityWindowSizeStayPut che è 500. Ciò significa che la dimensione della finestra ha la priorità sulla dimensione della vista.

È possibile impostare questo dall'ispettore di dimensioni IB.

Compression resistance priority

Oppure si può impostare a livello di codice con -[NSView setContentCompressionResistancePriority:forOrientation:]

+0

Sembra giusto che questo sia un problema prioritario. Tuttavia, nel caso in cui sia stata richiesta questa pubblicazione, la finestra era più grande di quella necessaria per la sottoview aggiunta. La sottoview non sarebbe stata compressa ma espansa (il problema era che non si espandeva ma invece la finestra si restringeva). Questo significa che la priorità della resistenza alla compressione non entrerebbe in gioco? Anche la priorità di Hugging del contenuto deve essere impostata su <500 o sono confuso? (Ho lavorato con il layout automatico per quasi un anno e trovo ancora difficile visualizzare lo scopo di questi 2 insiemi di priorità). –

+0

sì, sei corretto, la priorità per il contenuto dovrebbe essere <500 invece.La priorità della resistenza alla compressione viene utilizzata quando si elabora la vista che deve ridursi quando si riduce lo spazio e il contenuto si abbraccia quando si aumenta lo spazio. Con la finestra resta la priorità di 500, quindi qualsiasi valore <500 significa che la dimensione della finestra vince,> 500 la vista vince – iain