iOS使用CIFilter生成二维码

2020-01-21 03:44:38王冬梅

clickButton: 方法中调用该方法:


- (IBAction)clickButton:(id)sender
{
  [self generateQRCodeImage];
}

此时,运行程序,在文本框中输入内容,点击按钮就可以看到生成的二维码:

iOS,生成二维码,CIFilter生成二维码

仔细的话你会发现这里的二维码比较模糊,这是由于生成的二维码尺寸较小,在imageView中显示时被拉伸导致的。下面我们就通过调整二维码的缩放来解决图像模糊的问题。

修改 generateQRCodeImage 方法中的代码如下:


- (void)generateQRCodeImage
{
  ...  
  // 获取生成的CIImage对象
  self.qrcodeImage = filter.outputImage;
  
  // 缩放CIImage对象
  CGFloat scaleX = self.imageView.bounds.size.width / self.qrcodeImage.extent.size.width;
  CGFloat scaleY = self.imageView.bounds.size.height / self.qrcodeImage.extent.size.height;
  CIImage *transformedImage = [self.qrcodeImage imageByApplyingTransform:CGAffineTransformMakeScale(scaleX, scaleY)];
  
  // 将调整后的CIImage对象转换成UIImage对象,并显示在图像视图中
  self.imageView.image = [UIImage imageWithCIImage:transformedImage];
}

再次运行,你会看到一张清晰的二维码:

iOS,生成二维码,CIFilter生成二维码

2.3.2 删除二维码图像

在这个demo中,按钮具有双重作用:即生成二维码和删除二维码。因此需要在 clickButton: 方法中先判断二维码图像是否存在:

    如果不存在,点击按钮生成一张二维码图像,按钮的标题变为" Clear "。 如果存在,点击按钮删除二维码图像,按钮的标题变为" Generate "。

修改 clickButton: 方法中的代码如下:


- (IBAction)clickButton:(id)sender
{
  if (self.qrcodeImage == nil) {
    [self generateQRCodeImage];
    [self.button setTitle:@"Clear" forState:UIControlStateNormal];
  }
  else {
    [self clearQRCodeImage];
    [self.button setTitle:@"Generate" forState:UIControlStateNormal];
  }
}

下面我们就添加 clearQRCodeImage 方法并实现它:


- (void)clearQRCodeImage
{
  self.imageView.image = nil;
  self.qrcodeImage = nil;
  self.textField.text = nil;
}

至此,二维码的生成和删除已基本完成,但为了有良好的体验,我们还需要考虑下面的情况:

    在文本框未输入的情况下点击按钮是否生成二维码。 切换按钮时文本框的响应状态以及键盘出现与消失。 滑动条的显示和隐藏。