iPhone contiene molte funzioni utili. Uno di loro è build-in telecamera e sistema di applicazione fotocamera per fare foto. Sembra grande ma per quanto riguarda l'uso della fotocamera con le applicazioni native? IPhone SDK offre la possibilità di uso della telecamera attraverso UIImagePickerController classe. Quello è grande ma c'è un piccolo svantaggio - non è possibile creare una visualizzazione a schermo intero persistente fotocamera vivere come l'applicazione Fotocamera fa. Invece di che si dovrebbe usare UIImagePickerController solo in modalità modale - mostrano la pop-up vista modale quando si ha bisogno di una foto e chiudere la vista dopo la foto è fatta. È necessario riaprire questo punto di vista nuovo per prendere quello successivo.
Inoltre, questo punto di vista modale contiene pannelli aggiuntivi e controlli che si sovrappongono alla vista della telecamera. Un altro svantaggio è - non è possibile scattare una foto in un solo tocco, è necessario toccare il tasto Spara per scattare una foto e di anteprima, e allora avete bisogno di toccare il pulsante Salva per ottenere la foto per l'elaborazione. La sua, probabilmente la migliore pratica, ma io non piace e spero che si pensa allo stesso modo.
Cosa succede ad usare il UIImagePickerController come un ordinale non modale controller della vista sotto il controller di navigazione stesso modo in cui usiamo il controller altro punto di vista? Provatelo e vi ha scoperto che funziona! La telecamera funziona e sembra come dovrebbe.È possibile assegnare un delegato ed eventi UIImagePickerControllerDelegate processo per ottenere e salvare la foto. Ok, toccare il pulsante di scatto, toccare il pulsante Salva - grande, youve ha ottenuto la foto! Ma basta dare uno sguardo a questo - il Retake e Save pulsanti rimanere al di sopra della telecamera, e non funzionano ora quando sono toccati Questo perché non è possibile ripristinare la vista per scattare un'altra foto dopo aver preso uno e toccare il pulsante Salva, la vista è congelato ed i pulsanti sono disabilitati. Sembra che avete bisogno di ricreare completamente l'istanza UIImagePickerController per scattare un'altra foto. Thats non così semplice e non troppo buona. E avete ancora bisogno di utilizzare i pannelli e pulsanti che si sovrappongono la telecamera
Ora ho un'idea! Quando tocchiamo Spara, la vista soste rinfrescanti e visualizza sola immagine dalla fotocamera, quindi dobbiamo toccare Retake o pulsante Salva. Possiamo ottenere che l'immagine e salvarla senza utilizzare il UIImagePickerControllerDelegate e poi toccare il pulsante Retake di programmazione per ripristinare la vista e avere un'altra foto? Certo che possiamo! Se si esplora la gerarchia fotocamera vista dopo aver toccato Spara vi accorgerete che c'è una vista nascosta di tipo ImageView. Questa classe non è descritto nel SDK, ma siamo in grado di esplorare i suoi metodi usando Objective-C capacità. Possiamo vedere che la classe contiene un metodo chiamato imageRef. Consente di provare questo Sì, restituisce oggetto CGImage! E la dimensione dell'immagine è 1200 x 1600 - la sua sicuramente l'immagine della telecamera!
Ok, ora sappiamo di poter ottenere le foto senza UIImagePickerControllerDelegate. Ma in quale momento dobbiamo fare questo? Possiamo prendere l'utente tocca il pulsante Spara per avviare l'elaborazione? E 'possibile ma non così buono.Ti ricordi il nostro scopo principale la creazione del persistente visualizzazione a schermo intero macchina fotografica come macchina fotografica sistema di applicazione è? Il suo tempo di farlo! Quando abbiamo esplorato la gerarchia vista, weve trovato che ci sono il numero di punti di vista sopra la vista della telecamera. Possiamo cercare di nascondere questi punti di vista e creare il nostro pulsante proprio sotto la telecamera per scattare la foto in un solo tocco. Ma come possiamo forzare la telecamera per fare le foto? E 'molto semplice - possiamo ottenere il selettore corrispondente dal pulsante Spara e chiamarlo dal nostro gestore di azione!
Ok, weve costretto ottenere l'immagine. Ma ci vuole pochi secondi. Come possiamo rilevare che l'immagine è pronta? E 'avvenuto quando i pulsanti Annulla e sparare sono sostituiti da Retake e salvare quelli. Il modo più semplice per rilevare questo sta iniziando un timer con breve intervallo e verifica i pulsanti. E allora possiamo ottenere e salvare la foto, utilizzando il selettore corrispondente dal pulsante Retake e chiamandolo per reimpostare la telecamera e prepararlo per fare una nuova. Ecco il codice:
/ / Girato pulsante sulla barra degli strumenti toccato. Fare la foto.
- (Void) shotAction: (id) sender {
[Self enableInterface: NO];
/ / Simula tocco sul pulsante di scatto il Selettore Image
UIControl * camBtn = [self getCamShutButton];
[CamBtn sendActionsForControlEvents: UIControlEventTouchUpInside];
/ / Imposta il timer per controllare la telecamera di controllo per rilevare quando l'immagine
/ / Dalla fotocamera sarà preparato.
/ Pulsante di scatto / Image Picker è passato come userInfo da confrontare con il pulsante corrente.
[ScheduledTimerWithTimeInterval NSTimer: 0,2 obiettivo: selettore di auto: @ selettore (savePhotoTimerFireMethod:) userInfo: ripete camBtn: NO];
}
Spara pulsante Picker immagine / / Return (il pulsante che fa la foto).
- (UIControl *) {getCamShutButton
UIView * TopView = [self findCamControlsLayerView: self.view];
UIView * buttonsBar = [objectAtIndex topView.subviews: 2];
UIControl * btn = [objectAtIndex buttonsBar.subviews: 1];
ritorno btn;
}
/ Picker Immagine / Return Retake pulsante che compare dopo che l'utente preme Shoot.
- (UIControl *) {getCamRetakeButton
UIView * TopView = [self findCamControlsLayerView: self.view];
UIView * buttonsBar = [objectAtIndex topView.subviews: 2];
UIControl * btn = [buttonsBar...larghezza;
bounds.size.width = boundHeight;
CGAffineTransform trasformare CGAffineTransformMakeTranslation = (altezza, 0.0f);
trasformare = CGAffineTransformRotate (trasformare, M_PI / 2.0f);
UIGraphicsBeginImageContext (bounds.size);
CGContextRef contesto UIGraphicsGetCurrentContext = ();
CGContextScaleCTM (contesto, - 1.0f, 1.0f);
CGContextTranslateCTM (contesto, altezza, 0.0f);
CGContextConcatCTM (contesto, la trasformazione);
CGContextDrawImage (contesto, CGRectMake (0.0f, 0.0f, larghezza, altezza), l'immagine);
UIImage * imageCopy = UIGraphicsGetImageFromCurrentImageContext ();
UIGraphicsEndImageContext ();
ritorno imageCopy;
}
Un'altra domanda importante è: in quale momento si può nascondere il punto di vista della telecamera e controlli sovrapposti e creare il nostro proprio tasto? Cercando l'Ops viewDidLoad La telecamera non è ancora creata. Cercando il viewWillAppear La stessa cosa Cercando il viewDidAppear Sì, il punto di vista sono stati creati e possono essere nascosti ora. Ok, ci nascondiamo che e creare una barra degli strumenti con il nostro pulsante Shoot. Funziona, ma i film sullo schermo - vediamo come il punto di vista standard e tasti sono indicati e poi nascosto. Come possiamo evitare questo? Ho provato un certo numero di modi e aveva trovato la migliore: si dovrebbe nascondere la vista prima di essere aggiunte alla vista della telecamera (quando il metodo addSubview della telecamera si chiama). E 'possibile usando Objective-C possibilità di sostituire il metodo dinamicamente a run-time. Ok, sostituire il addSubview dal nostro metodo. Nel nostro metodo siamo in grado di verificare che la vista passato è uno dei subviews vista della fotocamera e impostare la proprietà nascosto su YES. Così, abbiamo sostituire il addSubview nel viewWillAppear prima che la telecamera è stato creato. E noi creiamo la nostra barra degli strumenti e pulsante Spara nel viewDidAppear dopo la vista della telecamera viene creata..
/ / Imposta "nascosti" su YES se la visualizzazione secondaria è la fotocamera controlli di visualizzazione.
- (Void) myAddSubview: (UIView *) vista {
UIView * genitore = (UIView *) auto;
BOOL done = NO;
Classe cl = [visualizza classe];
NSString * desc = [cl descrizione];
if ([desc confronto: @ "PLCropOverlay"] == NSOrderedSame)
{
for (i = 0 NSUInteger; i <[view.subviews count]; i + +)
{
UIView * v = [objectAtIndex view.subviews: i];
v.hidden = YES;
}
done = SI;
}
[RootViewController exchangeAddSubViewFor: genitore];
[Genitore addSubview: Vista];
if (! fatto)
[RootViewController exchangeAddSubViewFor: genitore];
}
La tecnica sopra descritta è stata utilizzata in applicazione iUniqable disponibili da Apple App Store (sezione Social Networking). Sentitevi liberi di usare.
Sentitevi liberi di visitare il sito web dello sviluppatore www.enterra-inc.com
Nessun commento:
Posta un commento
Nota. Solo i membri di questo blog possono postare un commento.