一.Watch OS 的由来及现状
1.AppleWatch背景
-
Apple Watch 是苹果公司于2014年9月公布的一款智能手表 。
-
有Apple Watch、Apple Watch Sport 和Apple Watch Edition 三种风格不同的系列。
-
Apple Watch 采用人造蓝宝石水晶屏幕与Force Touch触摸技术,有多种颜色可供选择
2. 官方介绍
-
苹果官方的简短视频介绍 http://www.apple.com/cn/watch/more-to-love/
- 苹果的营销部分介绍AppWatch的功能更加的专业。
-
苹果官方的网页介绍 http://www.apple.com/cn/watch/。
1.开发环境的不同
-
Xcode需要6.4版本及以上
-
iOS系统需要iOS8.2及以上
-
iPhone手机需要iPhone5及以上
Xcode需要6.4版本及以上
iOS系统需要iOS8.2及以上
iPhone手机需要iPhone5及以上
1.2 WatchOS2.0 发布时间是2015年10月
-
Xcode需要7.0版本及以上
-
iOS系统需要iOS9.0及以上
-
iPhone手机需要iPhone5及以上
2. Watch OS1.0与2.0一个最大的区别就是Watch OS1.0的手表App不能够独立运行,必须要连接手机。而2.0的App可以单独在手表上运行。
- 在1.0,一旦手表没有连接手机,Watch App根本就打不开。
- 在2.0,Watch App能够在不依赖手机App的情况下独立运行。
- 2.0,尽管App能够独立,但是一款WatchApp始终还是作为iPhoneApp的拓展,所以手机上面还是会安装对应的iPhone App
1.1 创建项目是先创建iOS App工程,让后在target中添加Watch OS 1App,创建完成后多了 Watch App和Extension两个文件。
- 其中 Watch App 部分位于用户的Apple Watch上,它目前为止只允许包含Storyboard文件和Resources文件。在我们的项目里,这一部分不包括任何代码。
- WatchKit Extension 部分位于用户的iPhone安装的对应App上,这里包括我们需要实现的代码逻辑和其他资源文件
2.2 在创建完成的项目中可以看到,在Watch OS 2.0的项目中比1.0多了一个文件:ExtensionDelegate
- 该文件负责Watch App的生命周期。
- func applicationDidFinishLaunching() :项目加载时会调用
- func applicationDidBecomeActive() :项目显示界面时会调用
- func applicationWillResignActive() : 项目退到后台时会调用
- 虽然WachOS2.0能够独立运行,但是一个WatchOS2.0的App仍然有一个iOS App,这是因为苹果将Watch App作为iOS App的延伸和拓展
- 创建WatchApp之后一定要给storyboard添加一个模块,也就是我们常说的表芯,否则程序将报错:ERROR -[SPRemoteInterface _interfaceControllerClientIDForControllerID:] clientIdentifier for interfaceControllerID:395F0002 not found(说是controller的id找不到)
四.WatchOS 1.0 与iPhone交互框架
- 一部分是界面(UI界面的构建),而是逻辑代码的实现在WatchOS 1.0中,代码逻辑部分在WatchKit Extension中,也即上面所说的在iPhone 安装的App上,
- UI界面编译尚在Watch App上
-
Watch App 部分位于用户的Apple Watch上,它目前为止只允许包含Storyboard文件和Resources文件。在我们的项目里,这一部分不包括任何代码。
-
WatchKit Extension 部分位于用户的iPhone安装的对应App上,这里包括我们需要实现的代码逻辑和其他资源文件。
-
这两个部分之间就是通过 WatchKit进行连接通讯。
下图就是通讯的流程图
3.控制器的生命周期方法
-
(1)当Watch OS加载App中的Storyboard时,iPhone端也会开始加载对应的WatchKit Extension。
-
(2)当Watch OS开始初始化我们Watch App的Storyboard中的UI时,iPhone端WatchKit Extension会生成对应的WKInterfaceController,并且响应awakeWithContext:方法。
-
(3)当Watch OS显示当前加载的UI时,WatchKit Extension中对应的WKInterfaceController响应willActivate方法。
-
(4)当用户切换页面或者停止使用时,WatchKit Extension中对应的WKInterfaceController响应didDeactivate方法。
<span style="font-size:14px;">// 界面加载的时候 --->>调用我们可以在这里加载数据或者更新在StoryBoard中当前Controller添加的interface objects。 override func awakeWithContext(context: AnyObject?) { super.awakeWithContext(context) // Configure interface objects here. } // 将要显示界面的时候调用 --->>我们可以在这里更新interface objects或者处理其他事件 override func willActivate() { // This method is called when watch view controller is about to be visible to user super.willActivate() } //界面消失的时候调用(进入后台或者进入到其他界面) ---->>我们应该在这里清理task或者数据。在这里更新interface objects将会被系统忽略。 override func didDeactivate() { // This method is called when watch view controller is no longer visible super.didDeactivate() } </span>
注意:
*在iOS中,NSTimer是一个定时器,定时器的作用的是延迟执行一段代码。
*在WatchOS中,Timer是一个计时器,计时器与定时器是两个完全不同的概念。
Timer的使用如下面的代码,参考时间的正负代表的意义不同:
// 设置一个 10s 计时 timer.setDate(NSDate(timeIntervalSinceNow: 10)) //如果相对当前时间为正数则为倒计时 如果相对当前时间为负 则为正计时 如果需要从0开始正计时则直接设为 -0 timer.setDate(NSDate(timeIntervalSinceNow: -0)) //开始计时 timer.start()
五.特殊控件的使用和布局
1.语音输入控件:
- 语音输入控件是WatchOS系统独有的控件,它不仅仅只支持语音输入,还可以设定文本选择框和一些emoji表情
- App Watch的屏幕很小,所以没有类似Textfield的文本输入框,所有的输入文字只能通过预设或者调用siri来识别语音文字
- 语音输入控件与其他的控件不一样,它的本身并没有Api,也不能在storyboard中找到
- 它的调用是被直接集成在WKInterfaceController中的
2.Group控件2.1.1 WatchApp的storyboard中控件的布局规则
- 一行只能显示一个控件,无法将一个控件拖到另一个控件的左边或者右边。
2.1.2 如果想让一行显示多个控件,应该怎么办?
- 使用Group控件
2.1.3 Group控件的作用
-
Group控件是WatchApp中独有的控件,它是一个可以放置子控件的容器。
-
在IOS中有一个控件跟Group有一些类似,就是UIScrollerView控件。
2.1.4 Group控件的特性
-
WatchOS系统中唯一一个可以放置控件的容器
-
子控件也只能选择水平和竖直放置。
Group控件的Layout属性Vertical和Horizontal
3.控件的布局
- 在WatchOS1.0中我们无法通过代码对控件进行布局,只能在storyboard文件中设置
- 三种布局方式: 1>Size To Fit Content
3>Fixed
六.WatchKit框架UI总结
1.1-在WatchOS1.0中我们可以对UI控件做一些什么?
-
设置和更新控件的属性和内容。
-
可以动态设置外观(如字体颜色和背景图片等)。
-
可以设置隐藏使界面重新布局。
-
可以设置alpha让其透明。
1.2-我们不能对UI控件做一些什么?
- UI元素不能通过代码动态创建和删除。
- UI元素不能动态改变显示次序(位置)。
1.3-在WatchOS中,alpha和Hidden属性的区别
-
setHidden:会将控件隐藏,并且界面重新布局
-
setAlpha:会将控件变成透明不可见,但是界面不会重新布局
1.4-WatchOS2.0中,布局规则的改变
- 可以动态改变UI元素的显示次序
- 可以给UI元素添加动画
- 2.0中我们仍然不可以动态创建和删除控件
-
- 根据本人多年开发经验推测,可能苹果考虑到手表的芯片比较小,如果频繁在编译过程中动态创建UI,会消耗内存,并且也费电,所以不支持动态创建和删除UI控件
以上知识总结适合初学者,希望能够在学习的道路上我们共同成长 -