2016-03-19 15 views
1

Zor zamanlar yaşıyorum, basit olması gerektiğini düşündüğüm bir şey için. Sadece iOS uygulamasında fotoğraf çekerken flaşı yakmak istiyorum. Ve tüm denedim başarısız oldu ya da sadece yüzde 20 çalışıyor. Ya içerikli işlevini çağırarak Sonuna kadar deneyin blok içine 2 çizgilerini taşıyarak, kodun birçok lezzeti denediAVCaptureDevice'i bir flaşla kullanamazsınız

// Here we have: captureDevice.hasFlash && captureDevice.isFlashModeSupported(.On) 
    do {try captureDevice.lockForConfiguration() 
     captureDevice.flashMode = .On 
     captureDevice.unlockForConfiguration() 
    } catch let error as NSError { 
     print("captureDevice.lockForConfiguration FAILED") 
     print(error.code) 
    } 

: Burada

flaş aydınlatmaya ateş koddur Bu kod farklı noktalardan. Ama sırasında her durumda bu çalışan:

stillImageOutput.captureStillImageAsynchronouslyFromConnection(videoConnection) { 
(imageDataSampleBuffer, error) -> Void in 

aşağıdaki hatayı alıyorum:

captureDevice.flashMode = .On 

tarafından:

Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo={NSUnderlyingError=0x13f079340 {Error Domain=NSOSStatusErrorDomain Code=-16800 "(null)"}, NSLocalizedFailureReason=An unknown error occurred (-16800), NSLocalizedDescription=The operation could not be completed} 

Sonra çizgiyi değiştirin

captureDevice.torchMode = .On 

Daha fazla veya daha az çalışan bir şey alıyorum (maalesef oldukça az), hatasız, ancak bu meşaleyi kullanıyor, bu yüzden zamanlama sorunları olsun:

captureSession.commitConfiguration() 

cevap

0
: Benim kodunda bir noktada bu hattı kullanmak gerekiyorsa Ayrıca belli değil

Başka birinin aynı problemle karşılaşması halinde (şanssız olan tek kişi olduğumu düşünemiyorum!). İşte

Ben bularak sona erdi çözümdür: O iki talimatlar arasında, ilki birinci çalıştırmak gerektiğini görünüyor

(gerekirse AVFoundation üzerinde herhangi uzman daha fazla yorum yapmak için açığız):

stillImageOutput.captureStillImageAsynchronouslyFromConnection(videoConnection) 
captureSession.stopRunning() 

Flaşı yakma gerçeği, siparişi biraz rasgele hale getirir. İkinci komutu, ilk komutun tamamlama bloğu içine getirdiğimi çözmek için, bunu yaparak siparişin her zaman aynı olduğundan emin olun.

Sonra kullanabilirsiniz:

captureDevice.flashMode = .On // or .Off or .Auto 

ve tüm eserlerini.

Flaşın kullandığı modu ayarlamak için bir kod olduğunu unutmayın, her flaş aydınlatmasında (bu gönderinin başlangıcında önerildiği gibi) atılan kodu değil.

İlgili konular