> 相比于watch OS 1 ,OS 2将WatchKit Extension挪到了手表端,手表端将独立进行逻辑处理,编码方面没有太大变化,通信方式发生了改变,改为使用`WatchConnectivity`进行通信。 ![Paste_Image.png](/static/images/essay/1.png) ### 与手表端进行通信 你需要在iPhone端和手表端同时进行注册`WCSession`。 注册方式: ```  let session = WCSession.defaultSession()         if WCSession.isSupported() {             session.delegate = self;             session.activateSession()         } ``` 发送信息: ``` WCSession.defaultSession().sendMessage(["key":"value"], replyHandler: { (reply) in             //回调             }) { (error) in             //error         } ``` 我们观察一下`WCSessionDelegate`,其中包括很多通信中将使用到的协议方法,实现相关协议即可接收到信息。 你可能用的最多的会是这个协议方法: ``` 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 你可以把你的控件放在`group`上面,在group上你同样可以用左中右的布局进行布局,相当于html中的

,这样的布局方式是什么适合使用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一帧一帧绘制你的动画了,也就是用一系列图片串成一个动画,你可以使用`WKInterfaceImage`来实现这一点: ``` 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。 ![Paste_Image.png](/static/images/essay/2.png) 在watch中你可选择展示一个新页面或者展示多个新页面,展示多个新页面也就是通过左滑右滑进行展示,大概长成这样: ![Paste_Image.png](/static/images/essay/3.png) 这就是两个页面进行切换。 具体的方法: ``` 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端中的`window.rootViewController`同时这个方法将释放之前所有的界面. 返回上一界面: ```  self.popToRootController()  self.popController() ``` ------------------------------- watch目前的交互方式比较单一,同时apple开发的接口也较少,所以watch开发还是比较容易掌握的。 ### 欢迎加入iOS交流群537774852