Генерация матрицы данных с помощью 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)
Другие вопросы по тегам