WatchKit:图像未显示
WatchKit: image not shown
代码如下:
@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
我正在尝试从某些特定文本生成二维码并将其显示在手表界面中。问题是 generateQRCodeWithString:
生成的 UIImage 从未显示。但是,如果我从 WatchKit 扩展包中加载带有 [UIImage imageNamed:@"XXX.png"]
的图像,它会正确显示。
我不确定发生了什么。我错过了什么?提前致谢。
更新: 作为对 msk 的回应,我很确定。我试着对图像进行 NSLog,它给出 <UIImage: 0x7fc261d276e0>, {230, 230}
从 generateQRCodeWithString:
返回的图像不是 "real" 图像(简而言之)并且尚未完全渲染。将 CIImage
视为图像的外观概念,而不是实际像素。
将 generateQRCodeWithString:
中的 return
行替换为如下内容:
CGImageRef cgOutput = [[CIContext contextWithOptions:nil]
createCGImage:output fromRect:output.extent];
return [UIImage imageWithCGImage:cgOutput];
这会将 QR 码渲染为 CGImage
以将其转换为像素,然后再渲染为 UIImage
。
创建 CIContext
相对昂贵,如果您生成大量 QR 码,则上下文应该是静态的或类似的并初始化一次。不过一次性的应该没问题。
代码如下:
@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
我正在尝试从某些特定文本生成二维码并将其显示在手表界面中。问题是 generateQRCodeWithString:
生成的 UIImage 从未显示。但是,如果我从 WatchKit 扩展包中加载带有 [UIImage imageNamed:@"XXX.png"]
的图像,它会正确显示。
我不确定发生了什么。我错过了什么?提前致谢。
更新: 作为对 msk 的回应,我很确定。我试着对图像进行 NSLog,它给出 <UIImage: 0x7fc261d276e0>, {230, 230}
从 generateQRCodeWithString:
返回的图像不是 "real" 图像(简而言之)并且尚未完全渲染。将 CIImage
视为图像的外观概念,而不是实际像素。
将 generateQRCodeWithString:
中的 return
行替换为如下内容:
CGImageRef cgOutput = [[CIContext contextWithOptions:nil]
createCGImage:output fromRect:output.extent];
return [UIImage imageWithCGImage:cgOutput];
这会将 QR 码渲染为 CGImage
以将其转换为像素,然后再渲染为 UIImage
。
创建 CIContext
相对昂贵,如果您生成大量 QR 码,则上下文应该是静态的或类似的并初始化一次。不过一次性的应该没问题。