夏树正茂

花有重开日,人无再少年.

iOS测试之UIAutomation介绍

| Comments

UIAutomation是随着iOS SDK 4.0引入的,帮助开发者在while you sleep的时候也能帮你进行自动化的UI测试,它的测试代码使用Javascript编写,不过别担心,如果你对Javascript不熟悉的话,可以使用Instrument中UIAutomation的录制功能,它能将你的操作转换为测试代码,你只需要保存这些自动生成的代码就行,稍后我们将介绍该功能。

使用UIAutomation做自动化UI测试时,使用者需要做最基本的两件事情是:

  • 如何找到界面上的UI元素
  • 如何针对找到的UI元素进行测试操作

iOS中如何在一个工程创建多个App

| Comments

一般情况下,我们是一个App应用对应一个Xcode Project,但是如果你需要同时开发多个产品,而这些产品90%的数据结构以及交互方式都一样,呈现在用户面前的这两个产品,最大的不一样就是UI元素以及某些配色时,如果这个时候还是一个App一个Xcode Project,普遍的做法是:

你会先开发完成一个产品,然后在复制到其他的产品中,非常的麻烦而且效率很低,你需要一个一个文件去比对。如果你使用模块的方式,开发完一个模块,然后再利用Pod的方式导入到其他产品中,虽然这样可行,但是涉及到产品的迭代开发以及产品的随时会变的交互,模块的细化分很难实现。

如果你也面临这样的问题,不放考虑一下下面讲的一个工程来开发多个App

Classes and Metaclasses

| Comments

这是一篇译文,原文在这里,水平有限,翻译难免有错误的地方。

Objective-C是一个基于类别对象的系统。每一个对象都是某个类的实例,对象的isa指向它自己的类(Class),这个类描述了该对象所有的数据信息:开辟的空间大小,成员变量类型以及其他信息的排列,这个类同样也描述了该对象可以执行的一些行为:可以响应哪些selector以及它自己实例方法的实现。

类的方法列表里面其实就是该类的所有实例方法的集合,通俗的讲就是该对象可以响应的所有selectors。当你向一个类发送消息时,会通过objc_msgSend()去查找它自身的类的方法列表(如果它有父类的话,也会在它的父类方法列表中去查找)来决定调用哪一个方法。

ContentCompressionResistance和ContentHugging详解

| Comments

在Auto Layout的使用中,有两个很重要的布局概念:Content Compression ResistanceContent Hugging,从字面的翻译我们大概可以分别翻译为:压缩阻力以及内容吸附。但是光从字面意思来理解很难知道它们如何使用以及确切的设计意图。我最开始也是很迷糊而且在使用Auto Layout的过程中也没有使用过它们,直到最近稍稍研究了一下,发现它们的作用甚是巨大,所以我为了加深记忆,把我最近学习到的关于它们的概念在此稍作整理加以记录。

注:以下为了表述方便,将Content Compression Resistance记为压缩阻力,将Content Hugging记为内容吸附

Auto Layout使用小技巧

| Comments

目前由于Apple自己的Auto Layout写法比较啰嗦,所以出现了许多对原生语句进行封装的第三方开发库,这其中Masonry广受开发者的喜爱,所以以下都以Masonry来做演示说明,但对于Apple原生的写法也同样适用。

1、图片+文字居中显示

很多时候我们都会遇到这样的需求:一张图片旁边接上一段文字,然后让他们相对于父视图居中显示,以前我的做法是先知道图片的尺寸,然后来计算他们相对于父视图中心的偏移量,再进行布局。需求的样式大致如下:

大致效果

但是这样的缺点是每次都需要去据算距离中心的偏移量,很麻烦,对于这种情况其实可以添加一个辅助视图,让这个辅助视图的左边等于图片的左边,右边和文字的右边对齐,然后这个辅助视图相对于父视图居中显示就行。

App中拨打电话一点小总结

| Comments

App内发起电话拨打的一点小技巧

一、拨打电话

在App内发起电话拨打主要有两种方式:

1、利用这种方式发起的电话拨打,通话结束后不会直接返回App内,而是停留在通信录里面:

 NSString *str = [[NSString alloc] initWithFormat:@"tel:%@",@"131xxxx1909"];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:str]];

Xcode控制台打印CGRect

| Comments

在用Xcode调试开发的时候,我们经常需要在控制台打印某个视图的frame,以前的时候相当麻烦,但是从Xcode6.3以后,打印frame变得很简单:

1
2
3
4
5
6
7
8
// Before
(lldb) p (CGRect) [self frame]
(CGRect) $0 = (origin = (x = 0, y = 0), size = (width = 50, height = 100))
 
// After
(lldb) expr @import UIKit
(lldb) p self.frame
(CGRect) $1 = (origin = (x = 0, y = 0), size = (width = 50, height = 100))

AFNetworking2.0使用心得

| Comments

这段时间要将公司项目中的网络引擎由ASIHTTPRequest替换为AFNetworking,替换的过程比较曲折,在此记录下自己替换过程中得心得:

1、建立数据请求中介者

建立中介者是指项目中的数据请求都通过它去实现,而不是每一个数据请求都直接与AFNetworking打交道,这样做的好处是:

  • 将网络请求与第三方库依赖隔离开来,方便以后对第三方库的替换。
  • 方便处理网络请求的公共逻辑。