1,效果图:
点击生成按钮,显示二维码:
使用微信扫一扫后,获得如下界面:
2, libqrencode库:
libqrencode是一个日本人(Fukuchi太郎)写的生成二维码的跨平台c语言库。
官网是这里,Github在这里。
本人最喜欢的就是这种【<强>用c写成的,跨平台的,功能单一的,使用方便的强>】库!
IOS中Objc使用c/c++库超方便,android下,稍微麻烦一点。
3, Objc对libqrencode包装:
网上找的QRCodeGenerator类,由安德鲁Kopanev实现。
很简单,就一个方法,给定一个字符串,返回一个界面图像表示的二维码图片:
@interface QRCodeGenerator : NSObject +,(UIImage *) qrImageForString: (NSString *) string p_w_picpathSize: (CGFloat)大小; @end
来看一下实现的关键点:
+, (UIImage *) qrImageForString: (NSString *) string p_w_picpathSize: (CGFloat) size { ,,,if (! [string 长度]),{ ,,,,,,,return 零; ,,,} ,,,//第一步:通过utf字符串生成QRCode,调用的是libqrencode的核心函数 ,,,QRcode * code =, QRcode_encodeString ([string UTF8String], 0, QR_ECLEVEL_L,, QR_MODE_8,, 1); ,,,if 代码(!),{ ,,,,,,,return 零; ,,,} ,,,//第二步:create 上下文 ,,,CGColorSpaceRef colorSpace =, CGColorSpaceCreateDeviceRGB (); ,,,CGContextRef ctx =, CGBitmapContextCreate(0,大小,尺寸,,8日,size *, 4,色彩,,kCGImageAlphaPremultipliedLast); ,,,//第三步:空间变换 ,,,//因为CoreGraphic的坐标系是右手系,原点在左下角 ,,,//而UIKit中的坐标系是左手系,原点在左上角 ,,,//所以经过下面的平移和缩放矩阵操作后,就符合界面图像基于左手系左上角的表示 ,,,CGAffineTransform translateTransform =, CGAffineTransformMakeTranslation(0,造); ,,,CGAffineTransform scaleTransform =, CGAffineTransformMakeScale (1, 1); ,,,CGContextConcatCTM (ctx, CGAffineTransformConcat (translateTransform, scaleTransform)); ,,,//第四步:在图像上下文中生成二维码位图 ,,,//,draw QR 提醒却;能够context ,,, ,,,(QRCodeGenerator drawQRCode: code 上下文:ctx 尺寸:尺寸); ,,,//第五步:get p_w_picpath ,,,CGImageRef qrCGImage =, CGBitmapContextCreateImage (ctx); ,,,UIImage *, qrImage =, [UIImage p_w_picpathWithCGImage qrCGImage):; ,,,//第六步:some 版本 ,,,CGContextRelease (ctx); ,,,CGImageRelease (qrCGImage); ,,,CGColorSpaceRelease(色彩); ,,,QRcode_free(代码); ,,,return qrImage; }
主要是注意一下第三步,空间变换。<强>将右手系左下角原点变换到左手系统左上角的变换矩阵! ! 强>
4,名片格式:
百度百科对名片格式的详细说明
我们通过一个函数了解一下常用的格式(请见<强>代码注释强>):
<>之前——(NSString *), getVCardString { ,,,NSMutableString *, ret =, [[NSMutableString alloc] init]; ,,,//名片规范: ,,,//1,以开始:名片开头,结束:名片结束 ,,,(ret appendString: @“开始:VCARD \ n”); ,,,//2,定义了很多关键字,具体请参考百度百科,本例子用到了其中一些比较重要的关键词 ,,,//3,一般格式为,key :,价值,例如下面,FN:随风而行之青山磊落险峰行 ,,,(ret appendString: @“FN: "); ,,,(ret appendString: @“随风而行之青山磊落险峰行”); ,,,(ret appendString: @“\ n”); ,,,//4,如果有子项目的话,使用,隔开,例如下面的电话电话包含移动电话细胞和公司电话工作或者家庭电话回家,而且也可以是语音、传真等等 ,,,(ret appendString: @“电话;细胞;声音:“); ,,,(ret appendString: @“13900000000”); ,,,(ret appendString: @“\ n”); ,,,(ret appendString: @“电话;工作;声音:“); ,,,(ret appendString: @“021 - 12345678”); ,,,(ret appendString: @“\ n”); ,,,//同上,电子邮件也有子项目 ,,,(ret appendString: @“互联网电子邮件;参照:“); ,,,(ret appendString: @ 47178234 @qq.com”); ,,,(ret appendString: @“\ n”); ,,,//5,一个搞了我几个小时的坑需要注意:,见到代码中,最后都添加了“\ n”符,是吧。 ,,,//,,,因为,如果行的长度超过了75个字符,那么必须分行 ,,,//,,,所以,保险期间,每一项都添加换行符 ,,,(ret appendString: @“URL:”); ,,,(ret appendString: @“https://github.com/jackyblf”); null null null null null null null null null null null null null null null null null null