Posts Tagged ios

Swift语法介绍

2014.6.3日,苹果公布最新编程语言Swift,Swift是一种新的编程语言,用于iOS和OS X应用的开发,没有C的兼容性限制,Swift采用安全的编程模式,增加了现代功能,使编程变得容易,更灵活,更有趣,Swift的重新设计,依靠成熟和备受喜爱的Cocoa, Cocoa Touch 框架,是重新构想软件如何开发的机会。

以下为语法介绍

原文:A Swift Tour

传统建议新语言的第一个程序是打印“Hello world”,对于Swift是下面的一行代码

println("Hello, world")

如果你用C或者Objective-C编写过代码,这段句法会感觉熟悉,在Swift中,这是一行完整的代码,不需要引入单独的库比如输入输出或者字符串操作,在全局作用域下编写的代码会作为程序的入口,所以你也不需要main函数,你同样不需要在每段代码后面写分号

这次tour将教你使用Swift编程的足够信息,完成各种编程任务,如果你有不理解也不用担心,本次演示的任何内容在后面的章节中都有详细的介绍

Safari Mobile中的事件处理 – touch, gesture, mouse events

Safari for Mobile中使用触控操作,传统的鼠标事件无法完全支持,比如没有mousemove, dblclick事件,要想灵活处理交互,可以通过监听TouchEvent和GestureEvent,下面是各个事件调用顺序的介绍:

保留的mouse事件

safari mobile中也保留有部分鼠标事件,如:mousedown/mouseup/mouseover/moouseout/mouseclick, 当然这些事件本身还是由touch事件开始触发的,准确的说只在单点触摸时触发,且在touch事件之后。

四种touch事件

touchstart, touchmove, touchend, touchcancel,分别表示触摸,移动,抬起手指,取消(我还不知道什么时候会调到这里)

三种gesture事件

如果有多点触摸,每个点都会派发自己的touch事件,当然处理一堆touch事件会比较麻烦,safari同时会派发gesture事件,包括gesturestart, gesturechange, gestureend, 分别表示开始多点触摸,触点在移动,结束多点触摸,IPhone中双指捏拉伸过程中都会派发这些事件。

单点触摸过程

多点触摸属于高级事件,我暂时用不到,只对单点的情况作处理。

判断是否是单点触摸:

evt.touches.length == 1

几种常见操作

点击 – tap

touchstart, touchend, (mouseout, mouseover,) mousedown, mouseup, click

点击移动 – tap and move

touchstart, touchmove, touchend

连续两次触摸 – double tap

touchstart, touchend, touchstart, touchend

多点触摸 – pinch

(touchstart, )gesturestart, touchstart, gesturechange, touchmove, gesturechange, touchmove, gestureend, touchend

从上面的事件顺序可以看到,只有在轻拍动作时会触发mouse 事件,其他情况下都不会触发(包括双击,两只手指同时点击……)

扩展事件

有很多种触摸操作方式,如双击(double tap),长按(touch and hold),捏(pinch)…没有直接这样类型的事件,比如safari mobile中并没有doubletap事件可以监听,也没有hold事件,只有上面列的四种touch,三种gesture,而像双击这样的比较常用,可以自己扩展, 如double tap:

双击时间的定制

svg.ontouchstart = function(evt){
    if(evt.touches.length == 1){
        var now = evt.timeStamp;
        if(this.touchTime && now - this.touchTime < 200){//时间间隔200ms时算 double tap
            delete this.touchTime;

   this.doubletap(evt, this); //这里判断是double tap
        }
        this.touchTime = now;
    }
};

同样touchhold也有办法,可以通过timer实现,复杂一下,这里不作细究

获取触点位置和target

touch 事件也有target属性,可以如桌面版的mouse事件同样处理
对于位置需要注意,因为touch事件包含多个触点的信息,也就是说包含多个触点的位置,对于单点触摸的情况,也要取touch集合中的第一个

var touch = evt.touches[0];//取第一个触点
 var x = touch.clientX;
 var y = touch.clientY;

备注:没有touch.layerX属性,用clientX代替,这可能与mobile上的缩放布局机制不同有关,待后研究

Objective-C – 关联引用

你可以使用关联引用模拟在已存在的类上添加对象参数,这个功能只在Mac OS X v10.6和以上版本支持

在类外添加存储

使用关联引用,你可以对一个对象添加数据而不需要修改这个类定义,这在你没有这个类的源代码时很有用,或者是为了二进制兼容的原因你无法修改这个对象的时候。

关联基于一个key,所以你可以在一个对象上添加多个关联,每个使用不同的key,关联对象也可以确保被关联的对象是否存在,至少在源对象的生命周期内(也就是说这个对象没有将被引入到垃圾回收系统的可能性)

创建关联

你可以使用方法 objc_setAssociatedObject 创建一个关联,这个方法有四个参数,源对象,key,值,关联方式,key和关联方式值得进一步说明

  • key是一个 void 指针,必须唯一,通常使用static变量
  • 方式指关联对象是否转让,保留还是复制,关联是按原子级还是非原子级,这与声明属性的元属性类似( “Property Declaration Attributes”),你可以使用一个常量(见 objc_AssociationPolicy)来指定这种联系的方式

下面的例子显示如何建立一个数组和一个字符串之间的关联