Domanda

Ho bisogno di capire come NSView autoresizes IT di vista. Ho impostato tutto in IB e le mie subviews ridimensionare bene (quando a ridimensionare la mia finestra in giro con il mouse). Tuttavia, se lo faccio [myMainView setFrame:] con il mio nuovo telaio rect, non succede nulla. Tutti i miei sub-vista sono ancora la dimensione originale (anche se la vista principale ha le dimensioni corrette). resizeWithOldSuperviewSize: del bambino viene chiamato, ma non è ancora di dimensioni appropriate.

Ho uno schermo pieno di elementi di cacao sullo schermo (screen # 1), etichetta, immagini, video. C'è un layout ben definito per questi elementi. Ho comportamento il ridimensionamento automatico di installazione tramite Interface Builder che funziona molto bene. Ridimensionando la finestra principale ridimensiona gli elementi in maniera soddisfacente.

Ora, l'utente fa clic sul pulsante "Avanti", dopo di che un secondo screenfull di elementi (schermo # 2) deve essere disegnato. I miei schemi sono costruiti sulla base di uno Screensize canonica (per esempio, 800x600). Ma ora la finestra è più grande (o più piccolo) perché è stato ridimensionato a schermo # 1. Quindi gli elementi sono ora solo prendendo una piccola area della finestra, invece di essere opportunamente dimensionati per riempire lo spazio disponibile. Voglio scalare questi elementi.

Perchè sono malinteso come il ridimensionamento automatico funziona? Come posso far scattare il meccanismo AutoResize sotto NSView manualmente?

Ci sono due cose che posso fare:

  1. ridimensionare manualmente gli elementi in base alle dimensioni dello schermo corrente rispetto alla dimensione originale. Questa opzione non è il mio preferito perché apparentemente, sono costretto a riscrivere il codice che è già lavorando in NSView (comportamento ridimensionamento automatico
  2. La mia seconda opzione è quella di richiamare la magia il ridimensionamento automatico del citato del NSView. La documentazione implica che [NSView SETFRAME:] lo farà per me. Quello che ho provato è stato, ridimensionare mio punto di vista dei contenuti al Screensize originale (800x600), rendono i miei elementi e quindi ridimensionarlo alla dimensione della finestra corrente. Concettualmente, non è identico al ridimensionamento manualmente la finestra? Sembra non essere. Ancora una volta, questa opzione è preferibile perché riduce al minimo la quantità di codice che si è te essere scritto e mantenuto.
È stato utile?

Soluzione 2

Si scopre che il mio approccio è corretto. Stavo impostando la dimensione del frame ad un valore non corretto, quindi non stavo ottenendo il comportamento previsto. Doh.

Altri suggerimenti

Questo codice

NSView* superView = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)];
NSView* subView   = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)];
[superView addSubview:subView];

[superView setAutoresizesSubviews:YES];
[subView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];

NSLog(@"subview's frame before resizing: %@", NSStringFromRect([subView frame]));
[superView setFrame:NSMakeRect(0, 0, 200, 100)];
NSLog(@"subview's frame after  resizing: %@", NSStringFromRect([subView frame]));

non dà il risultato previsto:

[...] subview's frame before resizing: {{0, 0}, {100, 100}}
[...] subview's frame after  resizing: {{0, 0}, {200, 100}}

Il tuo problema è altrove. Mi aspetto che uno dei vostri punti di vista del contenitore non è una parte della vista della gerarchia della finestra nel momento in cui si verifica il ridimensionamento.

Una buona soluzione per il vostro problema potrebbe essere l'uso di un NSTabView senza linguette, perché allora tutti i vostri punti di vista sono in ogni momento nella finestra (forse nascosta) e la visualizzazione a scheda si prende cura del ridimensionamento.

Un'altra soluzione è quella di mettere diverse viste in cima a vicenda e utilizzare setHidden: per mostrare solo uno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top