2010-10-10 10 views
8

Voglio un NSView che può essere ridimensionato trascinandone l'angolo in basso a destra, proprio come una NSWindow. Voglio essere in grado di incorporare questo NSView in un NSView padre. Esiste un componente come questo in Cocoa o nelle sue estensioni?Cacao: esiste un NSView con capacità di ridimensionamento utente?

+1

Si consiglia di controllare le cacao Autolayout Demos http://developer.apple.com/library/mac/#samplecode/Cocoa_Autolayout_Demos/Introduction/Intro.html In particolare l'app "DraggingAndWindowResize" –

risposta

7

Se si ottiene più specifico con la tua domanda, posso ottenere un po 'più specifico con la risposta. :-)

Non c'è niente di simile disponibile che io conosca, ma non è molto difficile da creare. La decisione da prendere è "chi gestisce il disegno dei grip di ridimensionamento e la logica di ridimensionamento/trascinamento?"

Visualizzazioni gestire i propri

Se la vista utente ridimensionabile gestisce disegnando le impugnature e rispondendo al ridimensionamento/trascinamento azioni in sé, allora dovete scegliere se si desidera che le impugnature disegnati in cima la vista del contenuto o "intorno all'esterno". Se si desidera che le impugnature "all'esterno", l'area "utilizzabile" diminuisca perché il contenuto deve essere sufficientemente inserto per lasciare spazio a disegnare i controlli di ridimensionamento, il che può complicare le metriche di disegno e dimensionamento. Se si disegna il grip "in cima" al contenuto, è possibile evitare questo problema.

Container View gestisce tutte subviews

L'alternativa è quella di creare un "ridimensionabile vista vista contenitore" che richiama le manopole di ridimensionamento intorno perimetri qualsiasi subviews' e gestisce il trascinamento/ridimensionamento logica da "bossing la sottoview in giro "quando (il contenitore) riceve eventi di trascinamento su una delle sue aree di grip. Posizionare la logica qui consente a qualsiasi tipo di sottoview di essere trascinabile/ridimensionabile e offre il vantaggio di avere solo un'istanza della vista leggermente più pesante (rispetto a molte istanze di sottoview che contengono la logica più complicata in esse).

il meccanismo di base

Una volta deciso che, in realtà è solo una questione di creare la vostra visualizzazione secondaria, che fa il disegno, gestisce le istanze NSTrackingArea (per le aree di presa), e risponde alle i metodi appropriati del mouse (giù, spostati, ecc.). Nel caso di ciascuna sottoview che gestisce il proprio, gestiranno le proprie aree di tracciamento, il disegno del grip e il mouse spostati, impostando il proprio frame in risposta. Nel caso di una vista container che gestisca tutto questo per le sue sottoview, gestirà tutte le aree di tracciamento delle sottoview e traccerà le proprie prese su se stessa, e imposterà la cornice della subview mirata (e la sottoview è beatamente ignorante dell'intera cosa).

Spero che questo ti aiuti almeno a dare un'idea generale dei possibili meccanismi. Se non mi fossi appena alzato e avessi iniziato il mio caffè del mattino, probabilmente sarei in grado di scriverlo in modo più sintetico, ma ce l'hai.:-)


EDIT 7 anni più tardi

perché non c'era più dettagli su ciò che il PO voleva, ho dato una risposta molto generica, ma dovrebbe fare alcune osservazioni:

  • preferiscono sempre un NSSplitView se può essere fatto funzionare per voi (cioè, se la vista allineati tra loro e dividono lo spazio del contenitore visione comune). Una vista divisa ti consente di personalizzare le aree di presa, ecc. E fa tutto ciò alla tua sottoview gratuitamente.
  • layout automatico non esisteva quando ho scritto questa risposta e notevolmente complica rotolare la propria soluzione per lo scenario vista-movimentazione-multiple-considerevole-subviews.
  • Se davvero bisogno di un elemento dell'interfaccia utente che può essere trascinata/ridimensionata all'interno di alcuni contenitori, fai il possibile per farla franca con l'utilizzo di CALayers all'interno di una vista master che gestisce tutto il layout/dimensionamento logica, se potete.
  • Se non riesci a fare quanto sopra (cioè la vista ridimensionabile contiene controlli e layout complessi, ha il proprio NSViewController, ecc.), Prova un approccio ibrido (usa i livelli per visualizzare le immagini memorizzate nella cache di viste non selezionate e solo aggiungere un pieno, visualizzazione secondaria interattivo considerevole per l'elemento selezionato (o subviews per gli oggetti).
  • a causa della complessità del layout automatico, non posso davvero consigliare il vero approccio visualizzazione secondaria trascinabili a tutti meno che non sia inevitabile. Se si sta progettando una vista che contiene cose mobili e di considerevoli dimensioni, è la cosa migliore (e più efficiente) per rendere tutto ciò che è sotto la responsabilità di questa vista Esempio: un'app grafica con molte forme dovrebbe avere una vista Canvas che rappresenta le forme (e qualsiasi decorazione della GUI come le dimensioni/grip, ecc.) usando CALayers. Questo sfrutta la grafica acc elerazione ed è lontano più efficiente di un mucchio di subview (molto pesanti in termini di risorse) NSView. Tutta la logica di spostamento/dimensione/selezione è gestita dalla "Vista quadro" e le uniche visualizzazioni secondarie potrebbero essere controlli sovrapposti (sebbene se il Canvas stesso debba essere racchiuso in una vista a scorrimento, è meglio usare il macchinario NSScrollView per consentire le viste sovrapposte stazionarie per questo scopo).
  • Se si progetta una vista che richiama molte cose (per le quali è consigliabile utilizzare layer per rappresentare tali elementi) ma consente di selezionare solo una cosa, l'approccio di aggiunta di una sottoview è gestibile abbastanza anche con AutoLayout. Se la cosa "selezionata per la modifica" ha molti controlli complessi che diventano visibili durante la modifica, una "sottoview di editor" con controller di visualizzazione associato ha senso ed è un buon compromesso in termini di manutenibilità (perché il controller di visualizzazione suddivide in compartimenti tutte le funzionalità di modifica/gestione dell'interfaccia utente) complessità della vista del contenitore (poiché una sottoview non interromperà il banco di risorse e manterrà vincoli AutoLayout temporanei per mantenere la sua posizione durante la visualizzazione del contenitore ridimensiona le interazioni dell'editor & non è eccessivamente complessa).
  • Tutto ciò presuppone macOS; se si progetta per iOS, sicuramente piegarsi all'indietro per utilizzare i livelli e il nuovo (al momento della stesura di questo manuale) trascinare e rilasciare macchinari, di cui conosco poco prezioso al momento.

In sintesi, la risposta è stata incompleta, così come un po 'datato, quindi mi sento il mio consiglio originale non è così buono come potrebbe essere in questi giorni.

+0

Grazie per i suggerimenti Joshua. Sembra che cucinerò da solo. – Max

0

Invece di utilizzare punti di vista, è possibile utilizzare Windows e impostare la maschera di stile della finestra per NSResizableWindowMask.

Un'altra opzione è l'utilizzo di un NSSplitView, se si dispone di due sottoview ridimensionabili e contigui.

Problemi correlati