Оказывается, что виноват AVCapturePhotoSettings.isAutoStillImageStabilizationEnabled
: по умолчанию это правда, а когда истинно длительность экспозиции и настройки ISO можно игнорировать / сбросить .
Решение - установитьзначение false, когда вы используете пользовательскую настройку экспозиции, например:
// self.customDuration is nil if we're on auto-exposure, non-nil if we are on manual exposure, ie. we called AVCaptureDevice.setExposureModeCustom
let photoSettings: AVCapturePhotoSettings
if self.photoOutput.availablePhotoCodecTypes.contains(.hevc), heicSupported {
photoSettings = AVCapturePhotoSettings(format:
[AVVideoCodecKey: AVVideoCodecType.hevc])
} else {
photoSettings = AVCapturePhotoSettings(format:
[AVVideoCodecKey: AVVideoCodecType.jpeg])
}
// auto still image stabilization destroys our settings for custom exposure (iso, duration), so turn it off if we have any
photoSettings.isAutoStillImageStabilizationEnabled = self.customDuration == nil ?
self.photoOutput.isStillImageStabilizationSupported : false