第九块石头

小心浮点数转整数发生的意外行为

| Comments

事情是这样的,我程序里有一个字符串常量@"4.81"

我需要把它转成@"481", 事实上从意义上说,并不是去掉小数点,而是把@"4.81"4.81乘以100再转成整数,最后转回字符串。

于是我就这样做了

1
[NSString stringWithFormat:@"%d", (NSInteger)([@"4.81" doubleValue] * 100)];

结果却是

1
@"480"

所以,好危险,遇到这种情况还是要检查过才行。至于解决办法…

获取全屏UIWindow

| Comments

如果客官是写代码给别人用的那一群人,很可能有在当前APP中弹出一个对话框或者窗口的需要,而且很多时候我们只知道那个APP是一个iOS程序,对它的实现一无所知(可能是cocos2dx,可能是unity3d…)。还好iOS程序有个常识——APP有window才能显示,我们需要做的就是获得那个window,把我们创建的UIView添加上去。

其实还有一些方案,比如创建一个UIWindow,保证它的level比Normal的level高,然后makeKeyAndVisible。这种做法会遇到问题,比如,在这个不是NormalLevel的window里用webview播放在线视频页面层次会错乱,在这个window里使用虚拟键盘,ios6下也会有问题。

还有一个方案,让用到你的代码的程序员提供一个UIView或者ViewController,然后把想要放的界面放进去,这个方案比较可靠,缺点是遇到那些没有iOS编程概念的程序员会很难教育,如果他们使用unity3d,他们可能根本不需要知道UIView是什么。

所以还是回到题目中的问题,首先要明白一个API只要不被不允许怎样使用,那么那个API的什么用法都有可能被程序员们用到。比如现在要说的UIWindow,一个APP最好不要使用多个UIWindow,我在stackoverflow上遇到过不少这样的告诫,作为一个写代码给别人用的人,我很感激他们用心良苦,但还是有很多人没有看到这种告诫或者无视掉, 拥有多个UIWindow的APP我见过不少。

要获得我们寄宿UIView的UIWindow就要知道下面几个事实:

1,有的程序不止一个UIWindow

防止CATransaction动画最后一帧闪动

| Comments

一直都留意到公司里的项目中的一个动画比较奇怪,前两天终于静下来研究了一下是什么问题。

那个是一个立方体切换动画,过程很正常,就是在动画的最后闪了一下。我怀疑是动画的最后并没有保持layer的transform属性,搜索了一阵后发现果然是这样。

CAAnimation默认是动画完毕后就把动画的transform去除(kCAFillModeRemoved),因此要保持动画的最终状态需要如下设置

1
2
cubicAnimation.removedOnCompletion = NO;
cubicAnimation.fillMode = kCAFillModeForwards;

在XCode的Run Script里调用python脚本

| Comments

昨天把同事的打包文档的python脚本改了一下,早上我在终端上运行没出问题,打算加到XCode里成为打包 SDK 的脚本的一部分,开始了漫长折腾…

首先我的 python 脚本是被一个bash脚本调用的

generate_doc.sh
1
2
3
4
5
#!/bin/bash

CURRENT_FOLDER=`cd $(dirname $0); pwd`
DOC_FOLDER="$CURRENT_FOLDER/../doc"
python3 "${CURRENT_FOLDER}/generate_doc/generate_doc.py" $DOC_FOLDER

我在Run Script

1
sh ${PRJ_ROOT}/dev/scripts/generate_doc.sh

提示两个错误
1,python3找不到
2,xxxx/../doc 是个文件夹

使用Cygwin给Windows安装Linux命令行

| Comments

以前也考虑过给Windows装一套命令行,因为Windows的命令行和Mac、Linux等不一样,有些功能没有,最关键都是,命令不一样~我还得去记一套新的命令~而Windows都命令行又不常用,没必要去记。

今天想远程控制家里的电脑,使用QQ的远程控制,经常发现无法发送鼠标事件到对方,于是又想到了用命令行远程登陆——当然Windows的远程登陆好多功能还是得用GUI来完成,好鸡肋啊~

上网找了一下,找到Cygwin,看上去不错,试了下,还是能满足需求的。

首先到Cygwin下载setup.exe。这个其实不只是一个安装包,还负责依赖的管理。

给Octopress增加生成QR二维码功能

| Comments

花了半天总算把QRCode边栏改为了可以直接像img标签那样的用法,方便在blog中随时添加带有URL的QRCode。当然稍微修改一下还能在里面包含其他的信息,不过我目前没那种需求,所以就做这个支持了。

为了让它能像img那样的使用,因此我很干脆的直接调用了ImageTag类进行解析。

需要修改plugins/image_tag.rb

SQLite加密版本SQLCipher编译过程——服务器

| Comments

很早以前就接触到了SQLCipher,当时已经很完善了,不过很悲剧的发现,SQLCipher版本间不兼容,每更新一次都得重新编译一次,那叫一个悲剧啊~

SQLCipher is an open source library that provides transparent, secure 256-bit AES encryption of SQLite database files.

虽然SQLCipher是开源的,但是仅仅是开源的而已——你要自己编译,不想自己编译就得付费购买已经编译好的二进制文件~~

木有钱,只好自己编译了。这里讲服务器端的编译过程。其实所谓的服务器,指的是Linux系的命令行核心的编译,例如centos、MacOSX等系统。

获得当前脚本文件所在目录

| Comments

只用$(dirname $0)是不能获得绝对路径的, 还要跳到那个目录,再获取绝对路径,命令如下

script.sh
1
2
3
#!/bin/bash
DIR=`cd $(dirname $0); pwd`
echo $DIR

WIFI干扰排除的一些经验

| Comments

最近发现WIFI丢包挺严重的,忽好忽坏。于是检查了一下WIFI,发现不知不觉中,小区内多了好多的WIFI热点,悲剧的是有的WIFI信号比我自己屋里的WIFI信号还强!!囧啊~~

估计很有可能是WIFI干扰了,之前在薄荷曾经就处理过WIFI频率冲突的问题,于是解决起来就轻车熟路了。

先查了一下周边的WIFI都用什么频道吧~按住Option点击mac的WIFI,会看到多出不少信息,里面有当前的连接的WIFI的信息,鼠标移到其他热点上,也会显示相应的频道等信息:

viewWithTag的搜索逻辑

| Comments

- [UIView viewWithTag:]这个方法经常用,一般也没出现什么问题,最近在一个项目中,采用动态增加subview的方式构造View,同时对特殊的view做了tag。问题出来了,整个view里面有好多相同tag的subview!!那么这个方法到底返回哪个view呢?他的实现逻辑又是什么?

查了一下官方文档:

This method searches the current view and all of its subviews for the specified view.

从这句话,很容易判断出:

  • 会首先判断当前view的tag是否匹配
  • 会递归搜索子视图

这个不难理解,就不多说了,我们来个例子分析我遇到的问题: