Tips:使用Xcode查找项目中的中文字符串

项目刚启动的时候 我们一般为了快速开发 会在使用字符串的时候直接选择硬编码到代码中 比如

1
self.lblTime.text = @"1分钟前";

但是之后 如果有国际化的需求的话 我们又会改成这样

1
self.lblTime.text = NSLocalizedString(@"one_min_ago", @"1分钟前");

不过随着代码越来越多 不免有疏漏 所以有时我们要去搜索一些漏网之鱼 这里分享一个快捷的方法

  1. 打开”Find Navigator”
  2. 切换搜索模式到 “Find > Regular Expression”
  3. 输入@"[^"]*[\u4E00-\u9FA5]+[^"\n]*?" (swift请去掉”@” 输入@"[^"]*[\u4E00-\u9FA5]+[^"\n]*?" 就好了)

看看效果

啊哦 发现了几个漏网之鱼 :)

如果你跟我一样嫌NSLocalizedStringcomment碍事 也可以用正则替换掉

  1. Find NSLocalizedString\((@"[^\)]*?")\s*,\s*@"[^\)]*"\s*\)
  2. Replace With NSLocalizedString\($1, nil\)

再见ZXing 使用系统原生代码处理QRCode

前言


二维码每个人都一定不陌生 尤其是在支付宝和微信的努力下 相信每个人都或多或少的使用过”扫一扫”这个功能
而作为开发者 大家都应该有过二维码的开发经验 不管是练习还是研究 或者是公司的项目(尤其是社交类的APP 基本都有扫一扫加好友这个功能吧?)

介绍


说到二维码 其实我们现在生活中接触到的都是QRCode —由日本人在上个世纪末用于汽车工业的一项发明 如今在移动互联网发光发亮
而实际上 除了QRCode 还有很多二维码的类型 最出名的应该就是DataMatrix了 而在4,5年前 一度还有很多QRCode的竞争对手出现 比如微软推出的Microsoft Tag 还有个人觉得很有意思的SnapTag 可是在这几年的发展过程中 还是QRCode笑到了最后 所以现在我们一般提起二维码 就指的是QRCode 下面我们就用QRCode来代替二维码

对于开发人员来说 熟悉的第三方QRCode库有:

  • ZXing
    Google出品并开源 一直到现在都还有专人维护 是世界上使用最广的二维码库 iOS上比较稳定的移植版是ZXingObj

  • ZBar
    功能上与ZXing不相伯仲 可惜的是项目在2012年之后就不维护了 虽然代码到现在还可以使用

而我从开始到现在一直是ZXing的忠实用户 除了Google的光环之外 那时候的ZXing资料也比ZBar多很多 不过随着iOS7的发布 苹果推出了内建的二维码扫描功能 这让这些第三方库多少显得有点尴尬了

閱讀全文

使用appetize.io为你的demo创建在线预览

前言


前几天开源了MMPopupView 今天想上传到CocoaControls上(CocoaControls应该不用过多介绍了吧? 想发现些新鲜好玩的控件 就每天去瞟两眼) 发现上传时填写信息项里多了一步

联想到CocoaControls之前改版了 应该是那个时候加入的appetize.io这个功能 简单来说 就是能让你的demo直接跑在网页里的服务 你只要把demo上传到appetize.io的网站上就可以了

閱讀全文

开源项目:MMPopupView

前言


弹出框组件应该是绝大多数应用都少不了的(只有极少数精心设计的APP会用不到) 当然我们的APP也不例外 之前我们APP的弹出框组件是我用pop写的 可是后来发现与系统原生动画有些冲突(pop内部用到了CATransaction 导致跟系统动画同时发生时会有问题) 所以上周花了大半天时间重写了一下MMPopupView这个组件

因为新写的组件完全是用Masonry写的 我觉得是个非常好的示例教程 结合之前我写的Masonry入门教程 应该可以更好的理解和运用Masonry/Autolayout 所以我又花了一点时间重新整理成了一个简单的开源库 有兴趣的朋友可以研究一下

运行的demo可以在这里查看

閱讀全文

图片变形的抗锯齿处理方法

前言

周末在微博上看到@周楷雯Kevin说起CALayer抗锯齿的问题

具体做法是:

1
layer.allowsEdgeAntialiasing = true

想起了很久以前也遇到过类似的问题 那时候要做一个类贴纸的应用 理所当然会遇到贴纸缩放和旋转的问题 所以锯齿的问题也是需要解决的 但是那时候是iOS4,5的时代 压根没有上面说的allowsEdgeAntialiasing这个东西(这个东西iOS7才公开 不过iOS6据说也可以用 但是黑科技嘛..你懂的)

所以当时求助了万能的stackoverflow 得到了一个非常简约而不简单的方法 就是我在微博上说的 只要把需要显示的图片留一个像素的透明边 就搞定了

方法

方法比较简单 我写成了一个UIImage的Category方法 然后一直尘封在我的工具库中好几年(遇到这个问题我才想起来)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- (UIImage *)antiAlias
{
CGFloat border = 1.0f;
CGRect rect = CGRectMake(border, border, self.size.width-2*border, self.size.height-2*border);

UIImage *img = nil;

UIGraphicsBeginImageContext(CGSizeMake(rect.size.width,rect.size.height));
[self drawInRect:CGRectMake(-1, -1, self.size.width, self.size.height)];
img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

UIGraphicsBeginImageContext(self.size);
[img drawInRect:rect];
UIImage* antiImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

return antiImage;
}

先来看看实际的效果(看不清楚的同学可以点大图)

可以看到旋转的时候若不做任何处理 确实是会有明显的锯齿 而使用透明边的方法 或者设置allowsEdgeAntialiasing 都可以消除锯齿

接下来看看这两种方法的性能比较 测试方法是在我的iPhone 5S上接连对500个UIImageView进行旋转 对比帧数 其结果如下

结果表明 allowsEdgeAntialiasing的性能还是比透明边的方式要差一点 所以…

  • 如果你的应用要支持iOS6- 可以参考透明边的方法 唯一的缺点是显示出来会比原来小那么一点点(我的做法是直接cut掉1px的边 当然你也可以直接在图像外面加1px的透明边)
  • 如果你的应用仅支持iOS7 推荐使用allowsEdgeAntialiasing来设置 简单方便咯 如果性能上觉得吃力的话 可以再考虑透明边的方法

小结


文中的demo可以在这里找到

测试的方法也许不太严谨(也是临时起意写的这篇 所以并没有花太多时间) 如果有错误 请大家提出来