相比于watch OS 1 ,OS 2将WatchKit Extension挪到了手表端,手表端将独立进行逻辑处理,编码方面没有太大变化,通信方式发生了改变,改为使用<code>WatchConnectivity</code>进行通信。
与手表端进行通信
你需要在iPhone端和手表端同时进行注册<code>WCSession</code>。
注册方式:
let session = WCSession.defaultSession()
if WCSession.isSupported() {
session.delegate = self;
session.activateSession()
}
发送信息:
WCSession.defaultSession().sendMessage(["key":"value"], replyHandler: { (reply) in
//回调
}) { (error) in
//error
}
我们观察一下<code>WCSessionDelegate</code>,其中包括很多通信中将使用到的协议方法,实现相关协议即可接收到信息。
你可能用的最多的会是这个协议方法:
optional public func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject])
这个方法将在前台时收到通讯信息,参数是一个字典。
协议中一共有三种方法,分别是:
/** ------------------------- iOS App State For Watch ------------------------ */
/** ------------------------- Interactive Messaging ------------------------- */
/** -------------------------- Background Transfers ------------------------- */
UI以及布局
相比于iPhone端,手表端受限于尺寸大小,UI控件数量上少了很多,经常使用到的UI控件包括:
group
Table
Image
Label
Button
Picker
以上控件都是适合手表尺寸上交互的控件,同时在UI布局上与iPhone端有较大区别,手表端不在使用坐标系进行布局,而是简单使用左、中、右布局,也就是在水平和垂直上都左、中、右三个位置的选择,你只能在这个划分成九宫格的布局中摆放你的控件,当然你是可以控制你的控件的大小的。
group
你可以把你的控件放在<code>group</code>上面,在group上你同样可以用左中右的布局进行布局,相当于html中的<div>,这样的布局方式是什么适合使用storyBoard(当然你也只能使用StoryBoard)。
WKInterfaceLabel
WKInterfaceLabel和UILabel有较大的区别,里面的方法只有三个:
//设置文字
public func setText(text: String?)
//设置文字颜色
public func setTextColor(color: UIColor?)
//设置文本属性
public func setAttributedText(attributedText: NSAttributedString?)
WKInterfaceImage
WKInterfaceImage中的主要方法:
public func setImage(image: UIImage?)
public func setImageData(imageData: NSData?)
public func setImageNamed(imageName: String?)
这里需要注意一点:在watch中不支持像iPhone端那样的动画,你唯一制作动画的方法可能就是利用WKInterfaceImage一帧一帧绘制你的动画了,也就是用一系列图片串成一个动画,你可以使用<code>WKInterfaceImage</code>来实现这一点:
let image1 = UIImage(named: "image1")
let image2 = UIImage(named: "image2")
let image = UIImage.animatedImageWithImages([image1!,image2!], duration: 1)
self.heartImage.setImage(image)
self.heartImage.startAnimating()
像上面那样就是用两张图片拼接成一个动画,你还可以控制的属性包括动画的时间,动画的播放次数,开始动画和结束动画:
// Play all images repeatedly using duration specified in interface description.
public func startAnimating()
// Play a subset of images for a certain number of times. 0 means repeat until stop.
public func startAnimatingWithImagesInRange(imageRange: NSRange, duration: NSTimeInterval, repeatCount: Int)
public func stopAnimating()
·······················
watch中的UI控件大都使用十分简单,大家看看文档自己尝试一下都能整明白。
展示新页面
每一个controller都有一个Identifier,你想要展示这个controller就必须要设置Identifier。
在watch中你可选择展示一个新页面或者展示多个新页面,展示多个新页面也就是通过左滑右滑进行展示,大概长成这样:
这就是两个页面进行切换。
具体的方法:
public func presentControllerWithName(name: String, context: AnyObject?) // modal presentation//展示单个
public func presentController(namesAndContexts: [(name: String, context: AnyObject)])//展示多个
public func pushControllerWithName(name: String, context: AnyObject?) // context passed to child controller via initWithContext:
这里和iPhone端的展示方式是一样的,同样包括modal和push两种展示方式,他需要第一个参数就是上面填写的identifier,第二个参数则是传递给这个页面的参数。
在watch中还有第三种展示方式:
extension WKInterfaceController {
public class func reloadRootControllers(namesAndContexts: [(name: String, context: AnyObject)])
}
这个方法相当于iPhone端中的<code>window.rootViewController</code>同时这个方法将释放之前所有的界面.
返回上一界面:
self.popToRootController()
self.popController()
watch目前的交互方式比较单一,同时apple开发的接口也较少,所以watch开发还是比较容易掌握的。
很多文章欢迎访问我的个人主页:StrongX.cn