Генерация матрицы данных с помощью Swift 2 и ZXingObjC
Моя проблема заключается в следующем: я хочу сгенерировать матрицу данных с помощью ZXingObjC и показать ее.
В настоящее время я пишу приложение с XCode 7.3 и Swift 2. для создания матрицы данных со значением String. Поскольку ZXingObjC написан на Objective C, я попытался преобразовать его сам согласно этому примеру:
NSError * error = nil; ZXMultiFormatWriter * writer = [ZXMultiFormatWriter writer]; ZXBitMatrix * result = [Writer encode:@"Строка для кодирования" Формат:kBarcodeFormatQRCode ширина:500 Высота:500 Ошибка:& ошибка]; if (результат) { CGImageRef image = [[ZXImage imageWithMatrix:result] cgimage]; } еще { NSString *errorMessage = [ошибка localizedDescription]; }
Проблема возникает, когда я пытаюсь закодировать мою строку с помощью writer.encode(...), и я думаю, что хорошо уточнить, что я пытался использовать более длинную и меньшую строку, но результат все тот же.
делать { let writer = ZXMultiFormatWriter() let hints = ZXEncodeHints() как ZXEncodeHints let result = try writer.encode("foo", формат: kBarcodeFormatDataMatrix, ширина: 300, высота: 300, подсказки: подсказки) let imageRef = ZXImage.init(matrix: result) picture.image = UIImage(CGImage: imageRef.cgimage) } ловить { печать (ошибка) }
И, наконец, сбой приложения с этим исключением:
*** Завершение работы приложения из-за необработанного исключения "NSInvalidArgumentException", причина: "Не удается найти расположение символов, соответствующее сообщению. Кодовые слова данных: 17' *** Стек вызовов первого выброса: ( 0 CoreFoundation 0x00000001081b7d85 __exceptionPreprocess + 165 1 libobjc.A.dylib 0x000000010854cdeb objc_exception_throw + 48 2 CoreFoundation 0x00000001081b7cb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000: форма: MinSize: MaxSize: сбой:] + 1178 4 ZXingObjC 0x0000000107ead4bb -[ZXDataMatrixEncoderContext updateSymbolInfoWithLength:] + 379 5 ZXingObjC 0x0000000107ea2866 -[ZXDataMatrixC40Encoder кодирование:] + 342 6 ZXingObjC 0x0000000107eaf032 +[ZXDataMatrixHighLevelEncoder encodeHighLevel: форма: MinSize: MaxSize:] + 1330 7 ZXingObjC 0x0000000107eb75b0 -[ZXDataMatrixWriter кодируют: формат: ширина: высота: подсказки: ошибка:] + 672 8 ZXingObjC 0x0000000107ee246c -[ZXMultiFormatWriter кодируют: формат: ширина: высота: подсказки: ошибка:] + 1100 9 DemoAppZXing 0x0000000103f54d98 _TFC4DemoAppZXing27VSMatrixOrderViewController11viewDidLoadfT_T_ + 8472 10 DemoAppZXing 0x0000000103f58002 _TToFC4DemoAppZXing27VSMatrixOrderViewController11viewDidLoadfT_T_ + 34 11 UIKit 0x0000000106a95984 -[UIViewController loadViewIfRequired] + +1198 12 UIKit 0x0000000106a9b93b -[UIViewController __viewWillAppear:] + 120 13 UIKit 0x0000000106acb750 -[UINavigationController _startCustomTransition:] + 1203 14 UIKit 0x0000000106adbb9b -[UINavigationController _startDeferredTransitionIfNeeded:] + 712 15 UIKit 0x0000000106adcd0b -[UINavigationController __viewWillLayoutSubviews] + 57 16 UIKit 0x0000000106c8b503 -[UILayoutContainerView layoutSubviews] + 248 17 UIKit 0x00000001069b5980 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 703 18 QuartzCore 0x000000010a2bfc00 -[CALayer layoutSublayers] + 146 19 QuartzCore 0x000000010a2b408e _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 366 20 QuartzCore 0x000000010a2b3f0c _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24 21 QuartzCore 0x000000010a2a83c9 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 277 22 QuartzCore 0x000000010a2d6086 _ZN2CA11Transaction6commitEv + 486 23 UIKit 0x00000001068f572e _UIApplicationHandleEventQueue + 7135 24 CoreFoundation 0x00000001080dd301 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17 25 CoreFoundation 0x00000001080d322c __CFRunLoopDoSources0 + 556 26 CoreFoundation 0x00000001080d26e3 __CFRunLoopRun + 867 27 CoreFoundation 0x00000001080d20f8 CFRunLoopRunSpecific + 488 28 GraphicsServices 0x000000010a8a1ad2 GSEventRunModal + 161 29 UIKit 0x00000001068faf09 UIApplicationMain + 171 30 DemoAppZXing 0x0000000103f60ec2 основной + 114 31 libdyld.dylib 0x000000010905492d start + 1) libC++abi .dylib: завершается с необработанным исключением типа NSException
Редактировать:
Чтобы решить эту проблему, мне просто нужно установить minSize и maxSize.
let hints = ZXEncodeHints () как ZXEncodeHints hints.maxSize = ZXDimension.init(ширина: 1000, высота: 1000) hints.minSize = ZXDimension.init(ширина: 1, высота: 1) let result = try writer.encode(generateStr[0], формат: kBarcodeFormatDataMatrix, ширина: 500, высота: 500, подсказки: подсказки)
2 ответа
Метод для возврата UIImage в окончательной форме вам нужно:
func generateDataMatrixQRCode(from string: String) -> UIImage? {
do {
let writer = ZXMultiFormatWriter()
let hints = ZXEncodeHints() as ZXEncodeHints
let result = try writer.encode(string, format: kBarcodeFormatDataMatrix, width: 1000, height: 1000, hints: hints)
if let imageRef = ZXImage.init(matrix: result) {
if let image = imageRef.cgimage {
return UIImage.init(cgImage: image)
}
}
}
catch {
print(error)
}
return nil
}
Я думаю, что это "общая ошибка", связанная не со Swift, а с Zebra Crossing/ZXing. Попробуйте сделать прямоугольник больше, может помочь.
let result = try writer.encode("foo", format: kBarcodeFormatDataMatrix, width: 1000, height: 1000, hints: hints)