iOS之Apple Watch简介和使用

Apple Watch

初步了解

  • 简介
  • 项目演示
  • 创建项目
    • 简单的hello world
    • 项目结构
      • Extension:位于用户的iPhone安装了对应的App上,包含我们需要实现的代码逻辑和其他的资源文件
      • watch app:目前只允许包含storyboard文件和resource文件
      • InterfaceController:当前界面的控制器
        • 与UIViewController的区别是:InterfaceController最终继承的是NSObject
        • InterfaceController不会管理Watch APP的应用界面
        • Watch APP的界面是直接由Watch Kit来管理
      • NotificationController interface的通知控制器

生命周期

  • apple Watch启动原理

    • 用户点击Watch APP后,与Watch匹配的iPhone会启动extension,然后与Watch建立连接,产生通信
  • NotificationController:
    • Watch OS提供了默认的通知显示,当用户点击通知进入APP时,就会调用以下两个方法
    - (void)handleActionWithIdentifier:(NSString *)identifier forLocalNotification:(UILocalNotification *)localNotification
{

}

- (void)handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)remoteNotification
{

}
- 通过这两个方法获得通知的消息,跳转到目标界面
- 在NotificationController中可以实现以下两个方法
- (void)didReceiveLocalNotification:(UILocalNotification *)localNotification withCompletion:(void (^)(WKUserNotificationInterfaceType))completionHandler {

}
- (void)didReceiveRemoteNotification:(NSDictionary *)remoteNotification withCompletion:(void (^)(WKUserNotificationInterfaceType))completionHandler {

}
- 获得通知内容,并设置处理完成的回调Block
  • apple Watch的生命周期方法

    • init:用来初始化interface Controller
    • awakeWithContext:类似UIViewController中的viewDidLoad方法,用来配置interface Controller
    • willActivity:界面将要显示给用户时会被调用,主要用来对试图进行一些小的调整,大规模的初始化还是放在init和awakeWithContext
    • didDeactivate:用来清空界面,程序进入不活动状态,可以用它来终止Timer或者来停止动画,这个方法不能再对界面进行操作
    • command + L锁定屏幕

控件的基本使用

  • 标签

    • 属性:

      • installed:是否安装这个控件
      • horizontal:水平方向如何显示
      • vertical:垂直方向如何显示
      • size:
        • 自适应自身的宽高
        • 与当前的界面的等宽高
        • 设置固定宽高
      • adjustment:微调控件的值
  • 按钮
    • 改变label的文字
  • 图片
    • 显示一张图片

计算器

  • 搭建界面
  • 监听事件
  • 计算

控件的布局

  • group:一组是一个容器,它管理着在你的界面的其他视图的布局。可以指定背景颜色或图像来显示后面的组中的项目。
  • 综合小案例
- (IBAction)left {

    NSLog(@"=====");

    // 设置控件的 水平方向的位置
    // 这个方法只支持Watch OS 2.0
    [self animateWithDuration:2.0f animations:^{

    [self.ball setHorizontalAlignment:WKInterfaceObjectHorizontalAlignmentLeft];
    }];
}
- (IBAction)down {
    // 设置垂直方向的位置
    // 设置2s动画
    [self animateWithDuration:2.0f animations:^{
        [self.ball setVerticalAlignment:WKInterfaceObjectVerticalAlignmentBottom];
    }];
}

- (IBAction)up {
    [self animateWithDuration:2.0f animations:^{

        [self.ball setVerticalAlignment:WKInterfaceObjectVerticalAlignmentTop];
    }];
}
- (IBAction)right {
    [self animateWithDuration:2.0f animations:^{

    [self.ball setHorizontalAlignment:WKInterfaceObjectHorizontalAlignmentRight];
    }];
}

效果图

控制器

  • 控制器的跳转

    • 使用storyboard
    • 使用代码的方式
注意:如果是push跳转方式,中间可以添加prsent跳转;但如果是prsent跳转方式,中间不可以添加push跳转

- (IBAction)push {
    // 跳转到下一个界面
    // 使用代码 push 到下一个界面
    // vc2 在控制器中设置identity
    [self pushControllerWithName:@"vc2" context:nil];
    // modal 方式
    [self presentControllerWithName:@"vc2" context:nil];

}
  • 控制器的创建

图片浏览器

  • 通过nextpage

WKDevice

- (void)awakeWithContext:(id)context {
    [super awakeWithContext:context];
    // iOS
    UIDevice *device = [UIDevice currentDevice];
    // watch OS
    WKInterfaceDevice *interfaceDevice = [WKInterfaceDevice currentDevice];
    // 添加缓存图片
    // 添加的过程中可能回添加失败
    [interfaceDevice addCachedImage:[UIImage imageNamed:@"ad_00"] name:@"xmg01"];
    [interfaceDevice addCachedImage:[UIImage imageNamed:@"ad_01"] name:@"xmg02"];
    // 会先判断该图片是否在缓存区内  如果在 直接取出来使用
    // 如果不在缓存区 创建一个名字为ad_00 的图片
    // 每一个watch app 的缓存区最大不超过 20m
    // 如果超过了20m  那么就一次从最开始的缓存图片开始删除, 用来存放新的缓存图片
    [self.showImg setImageNamed:@"ad_00"];

    // 从缓存区中删除缓存图片
    [interfaceDevice removeCachedImageWithName:@"xmg02"];

    // 设备里面缓存的所有图片
    // 存放的是图片的名字 和 图片的大小
    NSLog(@"所有的缓存图片  = %@", interfaceDevice.cachedImages);

    // 获取屏幕的大小
    NSLog(@" 当前屏幕的大小为 = %@  当前屏幕可以缩放的比例 = %f",NSStringFromCGRect(interfaceDevice.screenBounds),interfaceDevice.screenScale);

    // 在42mm 的手表下  屏幕大小是 : 宽:156 高: 195   312 X 390 资源图片的像素
    // 在38mm  屏幕尺寸  宽:  136  高: 170    272 X 340 资源图片的像素

}

数据的共享

- (void)awakeWithContext:(id)context {
    [super awakeWithContext:context];

    // 数据共享
    // iOS
//    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
//    [defaults setObject:@"xmgShareData" forKey:@"xmgKey"];

//    NSUserDefaults *defaults = [[NSUserDefaults alloc]initWithSuiteName:@""];

    // 1. 打开target中 app Groups  (iOS 上的  和 watch OS 上的)
        //1.1 打开成功之后 需要你写一个名字
    // 2. 使用以下方式创建数据库
    NSUserDefaults *defaults = [[NSUserDefaults alloc]initWithSuiteName:@"group.xmg"];

    [defaults setObject:@"网络太差" forKey:@"xmgKey"];

}
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    NSLog(@"share data = %@",[[[NSUserDefaults alloc]initWithSuiteName:@"group.xmg"] objectForKey:@"xmgKey"]);
}

打开target中 app Groups (iOS 上的 和 watch OS 上的)

其它控件

  • separator
  • switch
  • slider
  • date

tableView

  • InterfaceController.m
#import "InterfaceController.h"
#import "ShowCell.h"

@interface InterfaceController()
@property (unsafe_unretained, nonatomic) IBOutlet WKInterfaceTable *tableView;

@end

@implementation InterfaceController
// 删除一行
- (IBAction)delete {
    // 获取tableview的最后一行
    NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:self.tableView.numberOfRows - 1];
    // 删除一行
    [self.tableView removeRowsAtIndexes:indexSet];

}
- (IBAction)addRow {

    // 获取tableview的最后一行
    NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:self.tableView.numberOfRows];
    // 插入一行
    [self.tableView insertRowsAtIndexes:indexSet withRowType:@"row1"];
    // 滚到哪一行
    [self.tableView scrollToRowAtIndex:0];

}

- (void)awakeWithContext:(id)context {
    [super awakeWithContext:context];

    [self.tableView setNumberOfRows:5 withRowType:@"row1"];

    // 返回就是row
    for (int i = 0; i < 5; i++) {
        // 获取第i行的row
        ShowCell *cell =  [self.tableView rowControllerAtIndex:i];
        // 赋值
        [cell setImageName:[NSString stringWithFormat:@"ad_0%d",i] title:[NSString stringWithFormat:@"第%d个",i+1]];
    }
}

// 点击事件
- (void)table:(WKInterfaceTable *)table didSelectRowAtIndex:(NSInteger)rowIndex
{
    ShowCell *cell = [self.tableView rowControllerAtIndex:rowIndex];
    NSLog(@"=====%@",cell);
}

@end
  • ShowCell.h
#import <Foundation/Foundation.h>

@interface ShowCell : NSObject

- (void)setImageName:(NSString *)imgName title:(NSString *)title;

@end
  • ShowCell.m
#import "ShowCell.h"
#import <WatchKit/WatchKit.h>

@interface ShowCell ()
@property (unsafe_unretained, nonatomic) IBOutlet WKInterfaceImage *showImg;
@property (unsafe_unretained, nonatomic) IBOutlet WKInterfaceLabel *titleLbl;

@end

@implementation ShowCell

// 赋值
- (void)setImageName:(NSString *)imgName title:(NSString *)title
{
    [self.showImg setImageNamed:imgName];
    [self.titleLbl setText:title];
}

@end

效果图

pickerView

#import "InterfaceController.h"

@interface InterfaceController()
@property (unsafe_unretained, nonatomic) IBOutlet WKInterfacePicker *picker;

@property (unsafe_unretained, nonatomic) IBOutlet WKInterfacePicker *stackPicker;
@property (unsafe_unretained, nonatomic) IBOutlet WKInterfacePicker *sequencePicker;
@end

@implementation InterfaceController

- (void)awakeWithContext:(id)context {
    [super awakeWithContext:context];

    WKPickerItem *item1 = [[WKPickerItem alloc]init];
    item1.title = @"第一个";
    item1.contentImage = [WKImage imageWithImage:[UIImage imageNamed:@"ad_00"]];
    item1.caption = @"薯片真好吃";

    WKPickerItem *item2 = [[WKPickerItem alloc]init];
    item2.title = @"第二个";
    item2.contentImage = [WKImage imageWithImage:[UIImage imageNamed:@"ad_01"]];
    item2.caption = @"饼干真好吃";

    WKPickerItem *item3 = [[WKPickerItem alloc]init];
    item3.title = @"第三个";
    item3.contentImage = [WKImage imageWithImage:[UIImage imageNamed:@"ad_02"]];
    item3.caption = @"massage ";

    WKPickerItem *item4 = [[WKPickerItem alloc]init];
    item4.title = @"第四个";
    item4.contentImage = [WKImage imageWithImage:[UIImage imageNamed:@"ad_03"]];
    item4.caption = @"汤";

    [self.picker setItems:@[item1,item2,item3,item4]];
    [self.stackPicker setItems:@[item1,item2,item3,item4]];
    [self.sequencePicker setItems:@[item1,item2,item3,item4]];

}

- (void)willActivate {
    // This method is called when watch view controller is about to be visible to user
    [super willActivate];
}

- (void)didDeactivate {
    // This method is called when watch view controller is no longer visible
    [super didDeactivate];
}

@end

Glance

  • 相当于一个简介界面 也可以 作为启动页

动画

  • 渐变动画
  • 平移动画
  • hidden动画
  • 形变动画
#import "InterfaceController.h"

@interface InterfaceController()
@property (unsafe_unretained, nonatomic) IBOutlet WKInterfaceButton *firstBtn;

@end

@implementation InterfaceController
- (IBAction)lastBtn {

    [self animateWithDuration:2.0f animations:^{
        // 隐藏动画  第一个隐藏 后两个 跟这个补缺口
        [self.firstBtn setHidden:YES];
        // 缩放
        [self.firstBtn setRelativeWidth:0.8 withAdjustment:10];
        [self.firstBtn setRelativeHeight:0.4 withAdjustment:10];

        [self.firstBtn setHorizontalAlignment:WKInterfaceObjectHorizontalAlignmentRight];
        // 往下移动
        [self.firstBtn setVerticalAlignment:WKInterfaceObjectVerticalAlignmentBottom];
    }];

}

@end

alert

- (IBAction)showAlert {

    WKAlertAction *action = [WKAlertAction actionWithTitle:@"退出" style:WKAlertActionStyleCancel handler:^{
        NSLog(@"cancel");
    }];

    WKAlertAction *action1 = [WKAlertAction actionWithTitle:@"确认" style:WKAlertActionStyleDefault handler:^{
        NSLog(@"确认");
    }];

    WKAlertAction *action2 = [WKAlertAction actionWithTitle:@"你敢" style:WKAlertActionStyleDestructive handler:^{
        NSLog(@"他真敢");
    }];

    // action 一次排序的
    [self presentAlertControllerWithTitle:@"演示" message:@"message" preferredStyle:WKAlertControllerStyleAlert actions:@[action,action1,action2]];

    // 退出在左上角
    [self presentAlertControllerWithTitle:@"演示" message:@"message" preferredStyle:WKAlertControllerStyleActionSheet actions:@[action,action1,action2]];

    // 只需要两个action   一个action 就相当于一个按钮
    [self presentAlertControllerWithTitle:@"演示" message:@"message" preferredStyle:WKAlertControllerStyleSideBySideButtonsAlert actions:@[action,action2]];

}
时间: 2024-10-08 10:17:31

iOS之Apple Watch简介和使用的相关文章

苹果发布新一代编程语言Swift,边写代码边看结果,Apple Swift 简介

每年进入夏至前一个月,便是各高校毕业生的忙碌的季节-毕业论文,经非权威的调查显示,有近百分之九十的学生不到三十天就完成了论文的写作,更有百分之四十五的人不到十天就完成了毕业论文的写作,由此声音:这毕业论文在这么短的时间内完成质量高吗?对毕业后的工作有大的价值吗,工作单位会在乎毕业论文的质量吗? 因此得观点:毕业论文要不要写? 对于很多即将毕业的同学来说,毕业论文做的好与坏结果都是同样的毕业证,实在没有必要花太多的精力,通过万岁,一切只是为了顺利毕业."如果毕业论文不是跟学位证挂钩的话,我想以大多

iOS之多线程1-NSThread简介

关于多线程在iOS中的重要性,就不废话了.就一个字:重要 ! ^_^ iOS中常用的三种多线程方式:NSThread , GCD, NSOpertaion 虽然NSThrea排在第一位(几乎所有的介绍多线程的书籍都是这么排序),但用的最少,原因:没有后面的两个小弟用起来体贴. 作为多线程的大哥,NSThread几乎已经躲到幕后了. NSThread是从Mac OS 系统引入到iOS中的,在Mac OS 10.5之前,NSThread的启用方法只有一个: detachNewThreadSelect

Apple SIP简介及在Clover中如何控制

Apple SIP简介及在Clover中如何控制 来源 http://www.yekki.me/apple-sip-overview-and-how-to-disable-it-in-clover/ 什么是Apple SIP Apple SIP(System Integrity Protection)机制是OSX 10.11开始启用的一套关键的安全保护技术体系. SIP技术的整个体系主要分为: 文件系统保护(Filesystem protection) 对于系统文件通过沙盒限制root权限,比如

iOS 8 Apple Push Notification Service

Apple Configuration 1. create Apple ID in Apple Developer Website 2. check on "Push Notification" in the functionality 3. configure for Push Notification in Development: create certificate 3.1 upload the certificate file which is generated by ke

iOS开发 Apple Pay

一.什么是Apple Pay? 1. 概念 Apple Pay,简单来说, 就是一种移动支付方式.通过Touch ID/ Passcode,用户可使用存储在iPhone 6, 6p等设备上的信用卡和借记卡支付证书来授权支付: 它是苹果公司在2014苹果秋季新品发布会上发布的一种基于NFC的手机支付功能,于2014年10月20日在美国正式上线,2016年2月18日凌晨5:00, Apple Pay 业务在中国上线. 2. 使用前提 (1). 支持设备 Apple Pay支持的硬件设备 (表1) 线

iOS开发UIEvent事件简介

1.UIEvent简介 UIEvent是代表iOS系统中的一个事件,一个事件包含一个或多个的UITouch: UIEvent分为四类: UIEventType typedef NS_ENUM(NSInteger, UIEventType) { UIEventTypeTouches,//触摸事件类型 iOS3.0之后可以用 UIEventTypeMotion,//摇晃事件类型 iOS3.0之后可以用 UIEventTypeRemoteControl,//遥控事件类型 iOS4.0之后可以用 UIE

ios开发,多线程简介

什么是进程? 进程就是指,在系统中正在运行的一个应用程序,比如同时打开QQ,Xcode,系统就会分别启动两个进程. 什么是线程? 一个进程要想执行任务,必须得有线程,线程是进程的基本执行单元,比如使用酷狗播放音乐.使用迅雷下载电影,都需要在线程中执行 线程的串行:一个线程中任务对的执行就是串行 如果要在一个线程中执行多个任务,那么只能一个一个的按照顺序执行这些任务,也就是说,在同一个时间内,一个线程只能执行一个任务 什么是多线程? 一个进程中可以开启多条线程,每条线程可以并发,执行不同的任务 比

iOS 事件处理之UIResponder简介

在用户使用app过程中,会产生各种各样的事件 iOS中的事件可以分为3大类型:触摸事件.加速计事件.远程控制事件 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为“响应者对象” UIApplication.UIViewController.UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件 // 当手指开始触摸view // NSArray,字典,NSSet(无序) - (void)touchesBeg

iOS开发-Apple Pay-苹果支付

转自:http://www.open-open.com/lib/view/open1471952847228.html Apple Pay,是苹果公司在2014年苹果秋季新品发布会上发布的一种基于NFC(近场通讯)的手机支付功能,2016年2月18日凌晨5点,Apple Pay业务在中国上线. 它的支付方式是通过 Touch ID/Passcode 验证方式,用户可使用事先已经储存在IPhone 6 ,6p或者更新设备上的银行卡支付证书来授权支付,当然最新的5e,同样支持Apple Pay支付.