Ho una sequenza di NSViews fuori schermo in un'applicazione Cocoa, che vengono utilizzate per comporre un PDF per la stampa. Le viste non sono in una NSWindow, o sono visibili in alcun modo.Genera immagine in scala da NSView fuori dallo schermo
Mi piacerebbe essere in grado di generare immagini di anteprima di quella vista, esattamente come sembrerebbe il PDF, ma ridimensionate per adattarle a una certa dimensione di pixel (vincolata a una larghezza o altezza). Questo deve essere il più veloce possibile, quindi mi piacerebbe evitare il rendering in PDF, quindi la conversione in raster e in scala - Mi piacerebbe andare direttamente al raster.
Al momento sto facendo:
NSBitmapImageRep *bitmapImageRep = [pageView bitmapImageRepForCachingDisplayInRect:pageView.bounds];
[pageView cacheDisplayInRect:pageView.bounds toBitmapImageRep:bitmapImageRep];
NSImage *image = [[NSImage alloc] initWithSize:bitmapImageRep.size];
[image addRepresentation:bitmapImageRep];
Questo approccio funziona bene, ma non riesco a capire come applicare un ridimensionamento al NSView prima del rendering della bitmapImageRep. Voglio evitare di usare scaleUnitSquareToSize
, perché, a quanto ho capito, cambia solo i limiti, non il frame di NSView.
Qualche suggerimento sul modo migliore di farlo?
Stavo usando 'bitmapImageRepForCacheDisplayInRect:' e 'cacheDisplayInRect: toBitmapImageRep:' per generare dinamicamente le anteprime per un'app per notebook all'avvio. Con> 40 pagine (NSViews ospitate da layer) con un sacco di contenuti visivi, la generazione delle miniature richiedeva quasi 90 secondi. Questo non era il caso delle versioni precedenti di macOS. Ho sostituito questo metodo con l'approccio di @ tomtaylor sopra, usando una scala di 1.0 (dal momento che ho bisogno di miniature per scalare in modo fluido verso l'alto a grandezza intera) e la generazione di miniature è scesa a 20 secondi (in background), con circa la metà della memoria virtuale utilizzata! – Dalmazio