2015-03-04 2 views
4

Вот коды:WatchKit: изображение не показано

@interface InterfaceController() 
@property (nonatomic, weak) IBOutlet WKInterfaceImage *qrImage; 
@property (nonatomic, weak) IBOutlet WKInterfaceLabel *label; 
@end 

@implementation InterfaceController 
- (void)awakeWithContext:(id)context { 
    [super awakeWithContext:context]; 
    [self.label setText: @"Welcome"]; 
    UIImage *image = [InterfaceController generateQRCodeWithString:@"Welcome"]; 
    [self.qrImage setImage:image]; 
} 

- (void)willActivate { 
    [super willActivate]; 
} 

- (void)didDeactivate { 
    [super didDeactivate]; 
} 

+ (UIImage *)generateQRCodeWithString:(NSString *)string { 
    NSData *stringData = [string dataUsingEncoding:NSUTF8StringEncoding]; 
    CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; 
    [filter setValue:stringData forKey:@"inputMessage"]; 
    [filter setValue:@"M" forKey:@"inputCorrectionLevel"]; 

    CIImage *input = filter.outputImage; 
    CGAffineTransform transform = CGAffineTransformMakeScale(10.0f, 10.0f); 
    CIImage *output = [input imageByApplyingTransform: transform]; 

    return [UIImage imageWithCIImage:output]; 
} 
@end 

Я пытаюсь создать QR-код из некоторого определенного текста и показать его в интерфейсе часов. Проблема в том, что UIImage, созданный generateQRCodeWithString:, никогда не отображается. Однако, если я загружаю изображение с [UIImage imageNamed:@"XXX.png"] из пакета расширения WatchKit, он отображается правильно.

Я не уверен, что происходит. Что я упустил? Заранее спасибо.


UPDATE: В ответ на Мск, да я уверен. Я попробовал NSLog изображение, оно дает <UIImage: 0x7fc261d276e0>, {230, 230}

+0

Можете ли вы подтвердить, что generateQRCodeWithString возвращает изображение (не ноль)? – msk

+0

Этот код должен быть правильным. Я вытягивал свои волосы, пытаясь понять это (на несколько дней) !! Очевидно, что ваше изображение не ноль, но оно каким-то образом освобождено или удалено, когда вы идете установить его в 'WKInterfaceImage'. Мое лучшее предположение, что это ошибка с 'WKInterfaceImage'. –

+0

Вы, вроде бы, надеялись, когда я увижу, как вы создаете QRCodes в часах. Кажется, что WatchOS2 не поддерживает это :( –

ответ

2

Изображение с generateQRCodeWithString: не является «настоящим» изображением (кратким) и не было полностью отображено. Подумайте о CIImage как о концепции того, как должно выглядеть изображение, а не о фактических пикселях.

return Заменить строку в generateQRCodeWithString: с чем-то вроде этого:

CGImageRef cgOutput = [[CIContext contextWithOptions:nil] 
         createCGImage:output fromRect:output.extent]; 
return [UIImage imageWithCGImage:cgOutput]; 

Это будет оказывать QR-код на CGImage, чтобы превратить его в пиксели, а затем к UIImage.

Создание CIContext относительно дорого, и если вы генерируете много QR-кодов, контекст должен быть статичным или что-то еще и инициализироваться один раз. Но для разового, это должно быть хорошо.

+0

Это абсолютно блестящий ответ! Большое спасибо :) –

Смежные вопросы