为什么没有支持Apple Watch的自摄像头移动侦测软件睡眠软件

我为什么决定退回试用了30天的Apple Watch_网易数码
我为什么决定退回试用了30天的Apple Watch
用微信扫码二维码
分享至好友和朋友圈
摘要:今天是我还回苹果手表的最后一天,也是我决定自己生活中是否真的需要这块手表的日子。一般我不喜欢在手腕上带东西,而且之前业界对苹果手表也有过批评。我甚至有所保留地觉得,生活中又多了一样科技产品,不过会多分散些人们的注意力而已。这其实正是苹果手表需要解决的问题,它必须要给我足够有用、且足够有意义的功能,让我忘记可穿戴和分心的问题。很多科技媒体在苹果手表刚推出一周时间就做了测评,但是我觉得一周的使用时间根本无法了解这款设备究竟是否能融入到我们的日常生活之中。我带苹果手表已经一个月时间了,而且是每天带,洗澡带,跑步带,锻练带,闲逛带,睡觉带,开车带,工作带,社交带,总之,干什么都带。本文我是基于苹果手表在日常生活中使用的感受,不妨来感受下吧:外观和可穿戴性Apple Watch在我把手表带在自己手腕之后,并且带了一段时间,我发现到自己并没有注意到手腕上多了个东西。而且我的手腕上的体毛较多,但是带苹果手表却没有“夹毛”,要知道,其他可穿戴设备总是会发生这样的事情。只要你使用苹果产品一段时间之后,就会逐渐发现这其实是他们在设计上的小创新之一。苹果手表的地面被“挖空”了一些,所以实际上,它并没有完全接触到皮肤,同时也大大减少了塑料与皮肤之间可能产生的湿冷、出汗带来的不适感。不过,我觉得睡前最好还是不要带苹果手表,有时周末我会把它放在桌子上。苹果手表本身是一款略厚的设备,但是我自己觉得,虽然手腕上凸出了一块“东西”,但是毫无违和感。总体来说,我对苹果手表的外观感觉是比较中立的。我带的是配有白色表带的铝制运动版,外观看上去不算太差,事实上,我甚至觉得现实中真正带在手上的苹果手表,要比广告上看到的还要好。但说老实说,它的外观并不惊艳。本质上,苹果手表是一款“通知提醒”设备苹果手表并不是手机的“远程遥控器”,也不是一款媒体播放设备,更不是一款杀手级的健身电子设备。尽管苹果手表可以进行有限的通讯,但却不能在距离手机较远的地方操作。但是不要想错了,苹果手表的主要工作,至少现在来看,其实是把苹果手机上的应用通知提醒推送到手腕上,让你可以全天候看到这些通知消息。运动锻炼App应用运动锻炼App应用会提醒你站立起来,也会告诉你尽快完成自己每日的运动目标。你可以在手表上看到文本的来电信息。还有其他的App应用,比如可以在手表上提醒你在Uber上叫的车来了,也会提醒你是时候多喝点水了。笔者自己就能收到iPhone上的通知提醒,因此也没什么特别新鲜的。不过苹果手表的表现则更私人化,通知提醒会通过苹果哦的Taptic引擎在手腕上实体震动,手表播放器也会发声(通常是一种铃声),或是在手表上显示可视化消息。当你在手腕上感受到实际震动,然后点击手表表面获得通知提醒,这种体验会比手机上的通知提醒更好,而且用户一般也很难忽视这些通知提醒。苹果手表可以设置通知提醒,比如接收哪些App应用的提醒,如何接收提醒,何时接收提醒。不过,一些早期苹果手表评论家会抱怨手腕上接收太多通知提醒会导致人们分心,我认为这个批评非常合理。此外,苹果在此还犯了一些错误。当你首次设置自己的手表时,苹果会要求用户是否愿意镜像手机上的App应用和通知提醒设置。想要跳过这个设置流程?我回答是肯定的。苹果手表提醒苹果手表并没有为用户提供一个设置流程,要求他们准确的定位到需要接收哪些应用,哪些活动类型的通知提醒。你可能需要接收来自日程表的通知提醒,告知自己将要参加什么会议,出席什么邀请,等等。此外,你可能还需要用一种特定类型的触控震动来匹配即将来临的活动通知。所有这些功能并不能在启动手表的时候进行设置,你必须要去手机里的设置选项,在选择苹果手表设置里的“镜像手机”之后,才能完成。更容易分心?还是更不容易分心?通知提醒还是具有明确社会影响力的。正如The Verge网站的Nilay Patel指出,当你觉得和某人聊天非常无聊的时候,如果做其他事情会让人觉得不尊重,但现在,看看手表是个不错的选择。用户可以标记时间,在特别活动,或消息到来的时候,可以收到提示。苹果首席设计师Jony Ive几个月前,苹果首席设计师Jony Ive在纽约接受了采访,他表示好的技术不会导致用户分心,但是会让人们积极地参与到与好友,家人,同事之间的日常交互之中。当我们用手机在做一件事情的时候,往往会不自觉地玩儿起了手机上的其他应用,或许20分钟之后,你才会忽然觉得自己分心了,甚至忘记了自己最初要去做的正事儿。Matt Gemmell是畅销书作家兼博客主,他表示,苹果手表通过展示内容的方式,把用户又拉回到数字世界之中。他指出,相对于绝大多数不可执行的信息来说,苹果手表上的通知提醒信息量并不大,只需一瞥即能明白,而这些小信息量其实足够我们摆脱手机了。举个例子,如果你收到一条无关紧要的信息,只需在手腕上看一眼就可以了,这样的话,无需拿出手机,反而不太容易被分心。苹果手表通知栏这听上去似乎还挺明智的,但在我实际应用的时候,当我带上手表,收到信息之后,还是会不自觉地拿出手机来看一看。事实上,我发现自己收到的通知提醒消息开始变得越来越多,而我不得不经常要抬起手腕来看消息,毕竟自己潜意识里也不想忽略每一个通知。即便我不需要拿出手机,我也会经常被苹果手表搞分心,因为当手表上有了提示,我总想搞清楚究竟具体的内容,事实上,苹果手表就像是一个“引子”,把我引入了更深层的数字世界。不过,苹果手表的很多功能还是可以让用户不用使用手机的,比如Apple Pay和音乐播放器,但是这些功能还非常少,具有自主功能的手表应用数量还不够,坦白说,如果没有苹果手机做匹配,苹果手表几乎没啥用。至于发短信,也是喜忧参半。你只需抬起手腕,就可以立刻看到是谁给你发的短消息,同时通过手表也能创建一些简单的消息回复,比如一些固定短语(“我现在无法说话”),或使用表情符号。而在实际操作的时候,使用苹果手表并不简单,速度其实也不快。Digital Crown(数字皇冠)苹果手表实体按键苹果手表上最明显的实体按键,可能就是他们所谓的“数字皇冠(Digital Crown)”了,转动Digital Crown就可以放大和缩小显示大小,并且在不同的App应用之间进行滚屏接环,按压它则可以返回到设备主屏。数字皇冠的功能是根据具体使用环境来设定的,比如当你看地图的时候,可以选择它进行放大或缩小;有时它可以滚动显示文本消息;还有时可以控制手机上音乐播放的音量。此外,向下按压并保持一段时间可以激活Siri。数字皇冠其实可以做很多事情,只是用户往往会忽略它。没人会阅读操作手册(尽管我觉得苹果产品根本不需要操作手册),事实上,我觉得用户可能需要一定时间才能充分了解数字皇冠的全部功能。数字皇冠工作起来倒是没啥问题,接口反应是相当快的,而且反应也很顺畅,或许,我是说或许,在地图应用的时候数字皇冠会有一点点问题,因为我在放大缩小地图的时候会感觉有些卡顿。“社交”按键“社交按键”数字皇冠按键可以让用户快速创建自己的社交联系人群组,你只需点击一下就可以快速发起电话(在你的手机上),或是直接用语音发送文本消息。但就笔者个人来收,我并不是经常使用那个按键,我甚至有一点吃惊,苹果设计师竟然用这么大一个按键去实现这么有限的功能,不过是和一小组联系人进行交流。同样地,其实有一些其他方式来发起电话和文本短信。用户可以通过App屏来选择需要的应用,当然,想简单点儿的话,也可以使用Siri去打开社交应用。不过值得庆幸的是,这个由数字皇冠控制的大按键还有一个额外的功能,如果用户双击它,就可以打开移动支付功能,这个功能也是我使用比较多的一项功能。Glances如果你“狠狠”按下主屏幕(不是App应用屏),就会看到一系列屏幕,用户只需瞥一眼苹果手表就能获得更多资讯。你会看到在按键上有一行小点,此时的屏幕就是Glance屏幕了,用户只需瞥一眼,就能选择自己想要看哪个应用程序。GlanceGlance功能是一个不错的想法,该功能会将用户查看最频繁的信息进行精简,苹果针对性地优化了许多常用App应用。笔者已经逐渐开始养成了使用Glance的习惯了。除了唤醒苹果手表,查看时间和气温之外,用户可以访问更多信息,比如你可能想要扫一眼自己每天的运动进展,或是看看之后几天的天气情况,以及了解下股票价格,等等。我使用Glance功能时,遇到的唯一问题就是在打电话或是在切换应用的时候会出现卡顿,比如当我向上滑动手表屏幕,试图访问Glance功能时,苹果手表无法立即做出响应。另外要提一下的是,如果手表屏幕上有汗水滴在上面,反应也会变得不够灵敏,也就是说,如果在运动的时候,不小心有汗水落在表面,那么此时想看下自己的心率情况似乎会比较困难。地图苹果手表并不是一个使用地图应用的设备,原因就是它的屏幕实在是太小了。但是我个人觉得,苹果公司还是挺厉害的,至少让人们觉得在手腕上看到地图还是有些用处的。地图应用地图应用让苹果手表的Taptic引擎得以更好地应用,无论用户是在走路,还是在开车,只需在手表上轻轻敲击三次,就可以打开地图应用。当你从地图应用上获取了行驶方向数据,此时如果点击下手腕,虽然手表发出的导航语音音量可能不会太高,但是足够能让你明白是否需要在下个路口转弯了。这比从手机中获得语音导航命令的效果会更好,但有个小缺陷是,你无法从手表里面听到语音导航。导航的时候,需要注意的是智能手表需要依靠iPhone里的GPS信号,因此,使用地图功能时,用户必须要把手机带在身边,这样才能获得导航,并追踪到你的路线。当然啦,一般这不是什么大问题(我自己通常会随时随地带着手机),除了在跑步、骑单车、或是游泳的时候不会带着。运动应用苹果手表带有两个基本的健身应用,分别是Workout和Exercise。Workout应用可以让用户选择有氧运动,包括室内运动或室外运动,步行或跑步,爬楼梯,划船,骑单车,等等。苹果表示每一个锻炼都使用了独一无二的传感测量和特殊算法,精确的追踪用户锻炼的效果。用户可以告诉这款App自己需要消耗多少卡路里,之后它就会进行倒数,直到你达到目标。在你锻炼的时候,这款应用还会定时告诉你自己的步伐,距离,心率,消耗的卡路里等信息,最后当你完成锻炼之后,Workout会给你出一份包含上述指标的分析报告。运动应用我自己很喜欢跑步和步行,但不是一个大运动量的人,所以我觉得这款应用提供的信息已经足够了。不过,在我步行和跑步的时候,我发现想访问这些信息有些困难,这可能是因为我的汗水滴到了手表触摸屏上,导致反应有些迟钝,这点我已经在上文中提到了。下面来看看Exercise这款应用,该应用可以追踪每天用户走的步数,消耗的卡路里量,以及步行距离。用户可以按照自己每日的运动目标不断前进,Exercise应用会显示三种颜色圈,人们一看就知道自己的运动进度。这款应用还会在每个小时提醒用户从桌子上站起来活动一下,这个功能我使用的挺多的。不过,Exercise并不会像其他健身追踪器那样去追踪用户睡眠,或许这个功能可能将在下一个版本中新增上去。心率监测器心率检测器苹果手表中的心率监测器其实和其他健身追踪器上的心率监测功能是一样的,它会通过红外线扫描手腕皮肤,以此测量皮肤下方5到10秒的血流量率,然后推算出一分钟内的心跳数量。相对于其他健康可穿戴追踪设备,笔者个人相信这种测量方法会更加精确。而我觉得苹果手表心率监测器的主要问题是,运动的时候似乎很难访问该功能。因为一旦手表表面上有任何汗水,触摸屏似乎就无法检测到我的点触,在我身体运动的时候,比如步行,就无法做出回应。Siri智能手表上的Siri,就像是手机Siri异父异母的姊妹,如果在一个安静的房间里,手表上的Siri还能很好地运作,但是在现实环境下,Siri总是无法正常运作,不仅如此,手表上的Siri甚至不能说话。siri有些测评人总是喜欢说Siri可以很好地理解自然语言,但是我觉得根本不是这么回事儿。Siri似乎无法理解我在说什么(我一直在想是不是由于在户外使用的时候,有风会干扰),或许我提出的问题很难找到答案。有时候,我甚至反复说“hey Siri”都无法激活Siri。当Siri曲解了单词,我发现苹果手表上根本没有纠错或是重述单词的解决方案。因此我不得不删除整个文本,然后重新输入。如果我要修改的那个词是必须要录入的,有时我还得拿出自己的手机输入。Siri能理解一定数量的自然语言搜索。因此,如果你对它说,“我该怎么去Ocean Beach?”它可以快速找到地图,并把导航展示出来。但是,如果你问一个问题,比如“谁赢得了1959年世界职业棒球大赛?”,此时它就必须依靠配套的iPhone手机才能显示答案了。手机来电理论上,用户可以使用苹果手表上的小麦克风和扬声器来与他人沟通。但是它运作起来并不是非常好。即便是在非常安静的环境,而且没有背景噪音或风声的条件下,通话声音也是断断续续的。Apple PayApple Pay用户双击数字皇冠大屏幕,就可以激活Apple Pay移动支付系统。接着,你可以拿苹果手表对着POS终端,就会等到“叮”的一声,好了,支付完成。这是苹果手表可以独立完成的一项功能,无需手机支持。不过,苹果手表上的Apple Pay功能还不够完美。比如笔者略感失望的就是必须要双击按键才能使用Apple Pay,而在iPhone 6上的Apple Pay功能则可以直接在Passbook界面上自动启动,用户只需把手机靠在POS终端上即可,什么也不用烦。移动支付我希望智能手表上的支付功能能够更简便,例如晃晃手腕就能搞定,但事实显然不如我所愿。此外,为了设置手机上的Apple Pay功能,用户必须要设置密码跋扈,也就是说,用户必须要输入手表密码才能启动支付操作。电池和充电电池和充电到目前为止,或许人们对苹果手表颇有言辞的,就是它仅能支持18个小时的电池寿命,笔者也认为这是个问题。虽然我的苹果手表每天不会把电量耗尽,但是每天晚上充电是必须的,这点的确有些烦人。换句话说,你不能带着苹果手表睡觉,因为你必须要每晚给它充电。更可笑的是,苹果公司既然意识到用户不能带着手表睡觉,干嘛要在手表上加一个闹钟功能呢?(尽管苹果手表的闹钟功能做的很酷,因为这个功能在用户手腕上的震动力度恰恰好)所以……最后,我给苹果手表的评价就是,它似乎还不是非常适合带在我的手腕上。虽然苹果手表的软件和硬件设计的都很不错,但就算我不带着它,也不会觉得有任何不便,或是感觉若有所失。
Apple Watch订单不仅如此,我也不觉得通知提醒功能会让我的生活变得更简单,而且,除了Apple Pay之外的其他苹果手表功能,也没有给用户带来极佳的使用体验。苹果手表是一种全新的产品,它也让人们感受到苹果公司的独具匠心,但上面仍然有很多事情需要优化,很多功能需要新增,就目前来看,似乎苹果还有很长一段路要走。而对于App开发人员来说,在他们能够真正开发出提升手表功能的应用之前,还需要对这款设备有更进一步的了解。
本文来源:cnbeta网站
责任编辑:王晓易_NE0011
用微信扫码二维码
分享至好友和朋友圈
加载更多新闻
热门产品:   
:        
:         
热门影院:
阅读下一篇
用微信扫描二维码
分享至好友和朋友圈23被浏览54636分享邀请回答155 条评论分享收藏感谢收起12添加评论分享收藏感谢收起查看更多回答对 Apple Watch 的看法a year ago5收藏分享举报文章被以下专栏收录推荐阅读{&debug&:false,&apiRoot&:&&,&paySDK&:&https:\u002F\\u002Fapi\u002Fjs&,&wechatConfigAPI&:&\u002Fapi\u002Fwechat\u002Fjssdkconfig&,&name&:&production&,&instance&:&column&,&tokens&:{&X-XSRF-TOKEN&:null,&X-UDID&:null,&Authorization&:&oauth c3cef7c66aa9e6a1e3160e20&}}{&database&:{&Post&:{&&:{&isPending&:false,&contributes&:[{&sourceColumn&:{&lastUpdated&:,&description&:&&,&permission&:&COLUMN_PUBLIC&,&memberId&:136677,&contributePermission&:&COLUMN_PUBLIC&,&translatedCommentPermission&:&all&,&canManage&:true,&intro&:&&,&urlToken&:&hjcapple&,&id&:6876,&imagePath&:&02aa7a5bb0cd52f91f4deed1c5066d68.png&,&slug&:&hjcapple&,&applyReason&:&&,&name&:&黄二少碎碎念&,&title&:&黄二少碎碎念&,&url&:&https:\u002F\\u002Fhjcapple&,&commentPermission&:&COLUMN_ALL_CAN_COMMENT&,&canPost&:true,&created&:,&state&:&COLUMN_NORMAL&,&followers&:374,&avatar&:{&id&:&02aa7a5bb0cd52f91f4deed1c5066d68&,&template&:&https:\u002F\\u002F{id}_{size}.png&},&activateAuthorRequested&:false,&following&:false,&imageUrl&:&https:\u002F\\u002F02aa7a5bb0cd52f91f4deed1c5066d68_l.png&,&articlesCount&:49},&state&:&accepted&,&targetPost&:{&titleImage&:&&,&lastUpdated&:,&imagePath&:&&,&permission&:&ARTICLE_PUBLIC&,&topics&:[154965],&summary&:&苹果的硬件产品 1 代是不够好的,2 代才可用。似乎苹果官方也没有明确说是 2 代,只是升级了硬件,分 Series 1 和 Series 2,实际上也算是 2 代了。 Series 2 主要比 Series 1 多了 GPS 和防水功能。除了看时间,Apple Watch 这个设备适用于三大用途: 通知…&,&copyPermission&:&ARTICLE_COPYABLE&,&translatedCommentPermission&:&all&,&likes&:0,&origAuthorId&:0,&publishedTime&:&T00:43:27+08:00&,&sourceUrl&:&&,&urlToken&:,&id&:1143814,&withContent&:false,&slug&:,&bigTitleImage&:false,&title&:&对 Apple Watch 的看法&,&url&:&\u002Fp\u002F&,&commentPermission&:&ARTICLE_ALL_CAN_COMMENT&,&snapshotUrl&:&&,&created&:,&comments&:0,&columnId&:6876,&content&:&&,&parentId&:0,&state&:&ARTICLE_PUBLISHED&,&imageUrl&:&&,&author&:{&bio&:&iOS \u002F Mac \u002F C++ 开发者&,&isFollowing&:false,&hash&:&624dfc9564dbd296cb81c515c2fb6ae2&,&uid&:08,&isOrg&:false,&slug&:&huang-jing-cheng&,&isFollowed&:false,&description&:&- 代码和文章\n【GitHub】 https:\\u002Fhjcapple\n【知乎专栏】https:\u002F\\u002Fhjcapple\n\n- 个人项目\n【NextDoodle】https:\u002F\\u002Fcn\u002Fapp\u002Fle-tu-ya\u002Fid?mt=8\n【Vecode】https:\u002F\\u002Fcn\u002Fapp\u002Fvecode\u002Fid?mt=12\n【ToEbook】https:\u002F\\u002Fcn\u002Fapp\u002Ftoebook\u002Fid?mt=8&,&name&:&黄兢成&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fhuang-jing-cheng&,&avatar&:{&id&:&&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&memberId&:136677,&excerptTitle&:&&,&voteType&:&ARTICLE_VOTE_CLEAR&},&id&:429665}],&title&:&对 Apple Watch 的看法&,&author&:&huang-jing-cheng&,&content&:&\u003Cp\u003E苹果的硬件产品 1 代是不够好的,2 代才可用。似乎苹果官方也没有明确说是 2 代,只是升级了硬件,分 Series 1 和 Series 2,实际上也算是 2 代了。 Series 2 主要比 Series 1 多了 GPS 和防水功能。\u003C\u002Fp\u003E\u003Cp\u003E除了看时间,Apple Watch 这个设备适用于三大用途:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E通知提醒。\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E检测记录个人数据。\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E身份识别。\u003Cbr\u003E\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Cbr\u003E\u003Cp\u003E其它的听音乐、发短信、玩游戏、打电话、看地图、发朋友圈之类,都是可有可无的。只会偶然用一下,但不会经常用。这些需求用 iPhone 就足够了。\u003C\u002Fp\u003E\u003Cp\u003E设计 Apple Watch 上的软件,也应该多想想什么事情是手表可以做,而手机不能做的(或者做起来很麻烦)。仅仅将手机上的功能,照搬到手表上,是行不通的。同样对于用户,拿 iPhone 的使用习惯去使用 Watch,也注定会失望。\u003C\u002Fp\u003E\u003Ch2\u003E\u003Cb\u003E通知提醒\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cp\u003E我相信很多人有这个需求,闹钟怎么才能只吵醒自己,而不影响其它人呢?类似这种秘密提醒自己的需求, iPhone 做不到,而 Apple Watch 在手腕上震动就可以做到。\u003C\u002Fp\u003E\u003Cp\u003E同样,手表上也很适合做那些提醒喝水、番茄时间之类的 App。这些 App 在 iPhone 上也有,也很精美,但是不实用。在办公室中用这些 App,每隔 30 分钟就响一次,会很影响别人。也很少有人在办公室用这些 App。\u003C\u002Fp\u003E\u003Ch2\u003E\u003Cb\u003E检测记录个人数据\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cp\u003E所有的记录工具,最好都是无形的,需要人来干预就注定不能坚持使用。Apple Watch 可以自动记录个人数据,比如运动时间,行走路线、睡眠质量,心跳之类。这种数据对个人是很宝贵的。\u003C\u002Fp\u003E\u003Ch2\u003E\u003Cb\u003E身份识别\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cp\u003E比如付款、解锁电脑、取电影票之类。假如苹果出了汽车,也完全可以跟 Apple Watch 配对,手表就成了车钥匙。手表相对于手机更私密,更不容易被盗,也就更安全。\u003C\u002Fp\u003E\u003Cp\u003EApple Watch 这三大类用途都是被动式的,默默在运行。手表用途更偏向于工具、而不是社交和娱乐。Apple Watch 可以解决一些人的痛点,但很难成为 iPhone 那样的大众产品。\u003C\u002Fp\u003E\u003Cp\u003E可能有人会说,这些需求,用便宜的小米手环也可以做到啊,Apple Watch 有什么优势呢?有些原因决定了手环不能替代手表。\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E手环不够漂亮。\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E使用手环不能融入苹果的生态。\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E手环功能难以被第三方扩展。\u003C\u002Fli\u003E\u003C\u002Fol\u003E&,&updated&:new Date(&T16:43:27.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:1,&collapsedCount&:0,&likeCount&:5,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&reviewers&:[],&topics&:[{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&Apple Watch&}],&adminClosedComment&:false,&titleImageSize&:{&width&:0,&height&:0},&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&column&:{&slug&:&hjcapple&,&name&:&黄二少碎碎念&},&tipjarState&:&inactivated&,&annotationAction&:[],&sourceUrl&:&&,&pageCommentsCount&:1,&hasPublishingDraft&:false,&snapshotUrl&:&&,&publishedTime&:&T00:43:27+08:00&,&url&:&\u002Fp\u002F&,&lastestLikers&:[{&bio&:&字面包,号家中居士,伟大的修仙党人&,&isFollowing&:false,&hash&:&c5f581c2e6cac28fe4ee1cacf9f82c44&,&uid&:947100,&isOrg&:false,&slug&:&Himself65&,&isFollowed&:false,&description&:&努力提高姿势水平\n\n\n博客 http:\\u002Fhimself65\u002F\n其内容没有什么牛逼的,但都是个人的见识\n\n方向计算机科学-&图形学&,&name&:&扩散性百万甜面包&,&profileUrl&:&https:\u002F\\u002Fpeople\u002FHimself65&,&avatar&:{&id&:&v2-a5b191f97f3e&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&品牌推广&,&isFollowing&:false,&hash&:&76c446316ffb2ac4294aeab22779cdf5&,&uid&:32,&isOrg&:false,&slug&:&ontheroad&,&isFollowed&:false,&description&:&&,&name&:&风来坊&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fontheroad&,&avatar&:{&id&:&&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&&,&isFollowing&:false,&hash&:&f242d84ccbd3b69ea9b8fa&,&uid&:40,&isOrg&:false,&slug&:&hen-men-sao&,&isFollowed&:false,&description&:&&,&name&:&很闷骚&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fhen-men-sao&,&avatar&:{&id&:&v2-843f0acc505b2cd193ba90c&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:null,&isFollowing&:false,&hash&:&6eb1f599107cdcbc8ac2&,&uid&:80,&isOrg&:false,&slug&:&fish-db&,&isFollowed&:false,&description&:&&,&name&:&fish db&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Ffish-db&,&avatar&:{&id&:&0f54eb162a2ae&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&杨浦一只废猫&,&isFollowing&:false,&hash&:&0ea34d1b7ac1ef932f177d&,&uid&:24,&isOrg&:false,&slug&:&tomisacat&,&isFollowed&:false,&description&:&不匿名也是一种政治正确?&,&name&:&tomisacat&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Ftomisacat&,&avatar&:{&id&:&1bc899a2a&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false}],&summary&:&苹果的硬件产品 1 代是不够好的,2 代才可用。似乎苹果官方也没有明确说是 2 代,只是升级了硬件,分 Series 1 和 Series 2,实际上也算是 2 代了。 Series 2 主要比 Series 1 多了 GPS 和防水功能。除了看时间,Apple Watch 这个设备适用于三大用途: 通知…&,&reviewingCommentsCount&:0,&meta&:{&previous&:{&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&topics&:[{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&编程&}],&adminClosedComment&:false,&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&author&:{&bio&:&iOS \u002F Mac \u002F C++ 开发者&,&isFollowing&:false,&hash&:&624dfc9564dbd296cb81c515c2fb6ae2&,&uid&:08,&isOrg&:false,&slug&:&huang-jing-cheng&,&isFollowed&:false,&description&:&- 代码和文章\n【GitHub】 https:\\u002Fhjcapple\n【知乎专栏】https:\u002F\\u002Fhjcapple\n\n- 个人项目\n【NextDoodle】https:\u002F\\u002Fcn\u002Fapp\u002Fle-tu-ya\u002Fid?mt=8\n【Vecode】https:\u002F\\u002Fcn\u002Fapp\u002Fvecode\u002Fid?mt=12\n【ToEbook】https:\u002F\\u002Fcn\u002Fapp\u002Ftoebook\u002Fid?mt=8&,&name&:&黄兢成&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fhuang-jing-cheng&,&avatar&:{&id&:&&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&column&:{&slug&:&hjcapple&,&name&:&黄二少碎碎念&},&content&:&\u003Cp\u003E一直以来,我有三个需求。\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E躺在床上(特别是关了灯)看小说。\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E随时随地听故事。\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E记录自己每天做了什么,花了多少时间。\u003Cbr\u003E\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Cbr\u003E\u003Cp\u003E有了智能手机和 Kindle,我第一个需求已经被解决。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E现在的智能手机都带有文字转声音(tts)的功能。我使用自己写的 ToEbook,放本喜欢的小说进去,就可以读出来,这样第二个需求也已经被解决了。也有很多听书软件是真人读的,只是很多想听的书都没有,另外那些人读的太慢,又有多余的背景音乐。\u003C\u002Fp\u003E\u003Cp\u003E我更喜欢用 tts 来听书。现在的 tts 技术比以前好多了,虽然声音还是不够自然,也可以接受了。我大学时期尝试用「方正畅听」这个软件将 txt 文本转成 mp3 格式,放到 mp3 播放器再听,只是太麻烦,声音也不够好。\u003C\u002Fp\u003E\u003Cp\u003E第三个需求,记录时间。到目前为止,我没有见过任何一个 App 或者设备可以完美解决这个问题,或多或少有一些缺陷。时间是一段范围,需要记录开始时间和结束时间。时间记录软件大致有下面三种设计思路:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E有“开始”和“结束”按钮。点开始,开启计时器,点结束,就停止计时器。这种设计可以很精确记录时间,只是很多时候会忘记关掉计时器,这样数据就错了。忘记几次后,就会想着反正都已经不精确了,就不再使用了。\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E将 1 天时间,预先分成多个时间块。比如以半小时为最小单位,将 24 小时分成 48 小块。这样就没有开始和结束,只需要选择对应时间块。这种设计适用于一天总结,但时间记录不精确。\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E将时间区间简化成时间点,只记录下某时某刻在做什么。比如 7:30 分,在走路。8:45 分,吃早餐。这种方式可以大致记录下一天的行踪,但并不能统计某件事情花了多少时间。\u003Cbr\u003E\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Cbr\u003E\u003Cp\u003E另外所有的记录工具,无论怎么设计都好,都会忘记使用。从我的角度来看,记录实际上是一个收集过程,但一旦忘记使用几次,数据缺少一些,收集就不完美了,而一旦不完美了,就不想再使用了。理智上看,应该是可以记录多少就记录多少,总会有益处。但从情感上看,只要缺少一小块,就整个都不想要了。\u003C\u002Fp\u003E\u003Cp\u003E我以前收集小浣熊水浒卡片,最终收集完成 108 将,很宝贵,我专门用个铁盒子装起来,但有一天,我堂弟拿了我 5 张卡,还打牌输给别人了。剩下的 103 张卡,我就随便乱扔了。我猜测很多人都是这种情况,因此记账、记体重、写日记都很难坚持下去。\u003C\u002Fp\u003E\u003Cp\u003E理想的记录工具,应该是无形的,默默的运行,不用人来干预。我想买个 Apple Watch, 让它记录下我每天站立多少时间,运动多少时间,躺了多少时间,坐了多长时间。\u003C\u002Fp\u003E&,&state&:&published&,&sourceUrl&:&&,&pageCommentsCount&:0,&canComment&:false,&snapshotUrl&:&&,&slug&:,&publishedTime&:&T13:21:16+08:00&,&url&:&\u002Fp\u002F&,&title&:&时间记录工具&,&summary&:&一直以来,我有三个需求。躺在床上(特别是关了灯)看小说。 随时随地听故事。 记录自己每天做了什么,花了多少时间。 有了智能手机和 Kindle,我第一个需求已经被解决。 现在的智能手机都带有文字转声音(tts)的功能。我使用自己写的 ToEbook,放本喜欢的小…&,&reviewingCommentsCount&:0,&meta&:{&previous&:null,&next&:null},&commentPermission&:&anyone&,&commentsCount&:2,&likesCount&:5},&next&:{&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&topics&:[{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&Swift 语言&}],&adminClosedComment&:false,&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&author&:{&bio&:&iOS \u002F Mac \u002F C++ 开发者&,&isFollowing&:false,&hash&:&624dfc9564dbd296cb81c515c2fb6ae2&,&uid&:08,&isOrg&:false,&slug&:&huang-jing-cheng&,&isFollowed&:false,&description&:&- 代码和文章\n【GitHub】 https:\\u002Fhjcapple\n【知乎专栏】https:\u002F\\u002Fhjcapple\n\n- 个人项目\n【NextDoodle】https:\u002F\\u002Fcn\u002Fapp\u002Fle-tu-ya\u002Fid?mt=8\n【Vecode】https:\u002F\\u002Fcn\u002Fapp\u002Fvecode\u002Fid?mt=12\n【ToEbook】https:\u002F\\u002Fcn\u002Fapp\u002Ftoebook\u002Fid?mt=8&,&name&:&黄兢成&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fhuang-jing-cheng&,&avatar&:{&id&:&&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&column&:{&slug&:&hjcapple&,&name&:&黄二少碎碎念&},&content&:&\u003Cp\u003E我个人做的 App,都使用 Flash 设计图标,输出 swf 文件,之后用我写的 \u003Ca href=\&http:\u002F\\u002F?target=https%3A\u002F\\u002Fcn\u002Fapp\u002Fvecode\u002Fid%3Fmt%3D12\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EVecode\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E 将其转换成 Quartz 绘图代码,拖到工程中编译。用下列语句还原成 UIImage。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-cpp\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Elet\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eimage\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eg_picture_i_thumb_1\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EtransToImage\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E这种做法最大的优点是,方便地调节图片的颜色和大小,而不失真。也可以使用 svg 做 App,只是 svg 解析起来不够快。我将所有的动态图片(每张图对应于一个 swift 文件),分离到独立的 framework 预先编译,这样就不会拖慢编译速度。\u003C\u002Fp\u003E\u003Cp\u003E但这种方式最大的问题是图片不可以预览。其实也可以利用 llvm 解释 swift 绘图代码,编写一个 QuickLook 插件来预览,只是嫌麻烦一直没有做。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E我 App 中用到的所有图片素材,都是这样动态生成的。在实际使用中,遇到图片缓存问题。\u003C\u002Fp\u003E\u003Cp\u003EApp 很多图标其实是一样的,特别是 UITableViewCell 或者 UICollectionViewCell 中的图标。比如,屏幕上的 Cell 同时出现 10 个点赞图标,假如这样写代码是有问题的。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-cpp\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&k\&\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\&nc\&\u003EMyCell\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EUICollectionViewCell\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Efunc\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Esetup\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ewith\u003C\u002Fspan\u003E \u003Cspan class=\&nl\&\u003Eitem\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EDoodleListItem\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003ElikeImageView\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eimage\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eg_picture_i_thumb_1\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EtransToImage\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003ECGSize\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&nl\&\u003Ewidth\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&mi\&\u003E24\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&nl\&\u003Eheight\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&mi\&\u003E24\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E))\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Exxxxx\u003C\u002Fspan\u003E\n
\u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E\n\u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E图片动态生成,这样 10 个 Cell 生成 10 次。这样图片反复生成,会拖慢运行速度。这里需要将生成的图片缓存起来,让下一次复用。平常使用的\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-cpp\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Elet\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eimage\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EUIImage\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&nl\&\u003Enamed\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&s\&\u003E\&hello.png\&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E实际上已经做了缓存。最后我想了一个方案。先用 NSCache 实现一个通用的图片缓存类:\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-cpp\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&k\&\u003Epublic\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eprotocol\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003ETKCacheKey\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Evar\u003C\u002Fspan\u003E \u003Cspan class=\&nl\&\u003EcacheKey\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EString\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eget\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E\n\u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E\n\n\u003Cspan class=\&n\&\u003Eextension\u003C\u002Fspan\u003E \u003Cspan class=\&nl\&\u003EString\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003ETKCacheKey\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Epublic\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Evar\u003C\u002Fspan\u003E \u003Cspan class=\&nl\&\u003EcacheKey\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EString\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eself\u003C\u002Fspan\u003E\n
\u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E\n\u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E\n\n\u003Cspan class=\&k\&\u003Epublic\u003C\u002Fspan\u003E \u003Cspan class=\&k\&\u003Efinal\u003C\u002Fspan\u003E \u003Cspan class=\&k\&\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\&nc\&\u003ETKImageCache\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Eprivate\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Elet\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003E_cache\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003ENSCache\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E&\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003ENSString\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EUIImage\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E\n\n
\u003Cspan class=\&k\&\u003Epublic\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Einit\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E\n
\u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E\n\n
\u003Cspan class=\&k\&\u003Epublic\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Efunc\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eimage\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E&\u003C\u002Fspan\u003E\u003Cspan class=\&nl\&\u003EKey\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003ETKCacheKey\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EforKey\u003C\u002Fspan\u003E \u003Cspan class=\&nl\&\u003Ekey\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EKey\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&nl\&\u003Ecallback\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EKey\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E-&\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EUIImage\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E-&\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EUIImage\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Elet\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Estr\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ekey\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EcacheKey\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Eif\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Elet\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eimage\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003E_cache\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eobject\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&nl\&\u003EforKey\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Estr\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eas\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003ENSString\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eimage\u003C\u002Fspan\u003E\n
\u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E\n\n
\u003Cspan class=\&n\&\u003Elet\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eimage\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ecallback\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ekey\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003E_cache\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EsetObject\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eimage\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&nl\&\u003EforKey\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Estr\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eas\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003ENSString\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eimage\u003C\u002Fspan\u003E\n
\u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E\n\n
\u003Cspan class=\&k\&\u003Epublic\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Efunc\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EremoveAll\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003E_cache\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EremoveAllObjects\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E\n
\u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E\n\u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E再定义函数:\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-cpp\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Efunc\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003EgetCacheImage\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003E_\u003C\u002Fspan\u003E \u003Cspan class=\&nl\&\u003Efile\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EString\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003E_\u003C\u002Fspan\u003E \u003Cspan class=\&nl\&\u003Eline\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EInt\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&nl\&\u003Ecallback\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EVoid\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E-&\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EUIImage\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E-&\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EUIImage\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Elet\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ekey\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Efile\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E+\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eline\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EtoString\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()).\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EencodingToMd5\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003ETKImageCache\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EsharedInstance\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eimage\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&nl\&\u003EforKey\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ekey\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003E_\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ein\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ecallback\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E\n
\u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E\n\u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E之后就可以这样使用:\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-cpp\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&k\&\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\&nc\&\u003EMyCell\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EUICollectionViewCell\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Efunc\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Esetup\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ewith\u003C\u002Fspan\u003E \u003Cspan class=\&nl\&\u003Eitem\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EDoodleListItem\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003ElikeImageView\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eimage\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EgetCacheImage\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&err\&\u003E#\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Efile\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&err\&\u003E#\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eline\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Eg_picture_i_thumb_1\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EtransToImage\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003ECGSize\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&nl\&\u003Ewidth\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&mi\&\u003E24\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&nl\&\u003Eheight\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E \u003Cspan class=\&mi\&\u003E24\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E))\u003C\u002Fspan\u003E\n
\u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Exxxxx\u003C\u002Fspan\u003E\n
\u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E\n\u003Cspan class=\&p\&\u003E}\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E将 #file 和 #line 组合起来,可以保证 key 唯一不重复。没有缓存时,就会调用闭包动态生成图片,再进行缓存。假如不使用 #file 和 #line, 也可以用命令 uuidgen 生成 uuid, 复制过来作为唯一 key。\u003C\u002Fp\u003E&,&state&:&published&,&sourceUrl&:&&,&pageCommentsCount&:0,&canComment&:false,&snapshotUrl&:&&,&slug&:,&publishedTime&:&T17:17:11+08:00&,&url&:&\u002Fp\u002F&,&title&:&动态生成图片并缓存&,&summary&:&我个人做的 App,都使用 Flash 设计图标,输出 swf 文件,之后用我写的 \u003Ca href=\&http:\u002F\\u002F?target=https%3A\u002F\\u002Fcn\u002Fapp\u002Fvecode\u002Fid%3Fmt%3D12\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EVecode\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E 将其转换成 Quartz 绘图代码,拖到工程中编译。用下列语句还原成 UIImage。 let image = g_picture_i_thumb_1.transToImage()这种做法最大的优点是,方便地调节图片的颜色和大…&,&reviewingCommentsCount&:0,&meta&:{&previous&:null,&next&:null},&commentPermission&:&anyone&,&commentsCount&:0,&likesCount&:7}},&annotationDetail&:null,&commentsCount&:1,&likesCount&:5,&FULLINFO&:true}},&User&:{&huang-jing-cheng&:{&isFollowed&:false,&name&:&黄兢成&,&headline&:&- 代码和文章\n【GitHub】 https:\\u002Fhjcapple\n【知乎专栏】https:\u002F\\u002Fhjcapple\n\n- 个人项目\n【NextDoodle】https:\u002F\\u002Fcn\u002Fapp\u002Fle-tu-ya\u002Fid?mt=8\n【Vecode】https:\u002F\\u002Fcn\u002Fapp\u002Fvecode\u002Fid?mt=12\n【ToEbook】https:\u002F\\u002Fcn\u002Fapp\u002Ftoebook\u002Fid?mt=8&,&avatarUrl&:&https:\u002F\\u002F50\u002F_s.jpg&,&isFollowing&:false,&type&:&people&,&slug&:&huang-jing-cheng&,&bio&:&iOS \u002F Mac \u002F C++ 开发者&,&hash&:&624dfc9564dbd296cb81c515c2fb6ae2&,&uid&:08,&isOrg&:false,&description&:&- 代码和文章\n【GitHub】 https:\\u002Fhjcapple\n【知乎专栏】https:\u002F\\u002Fhjcapple\n\n- 个人项目\n【NextDoodle】https:\u002F\\u002Fcn\u002Fapp\u002Fle-tu-ya\u002Fid?mt=8\n【Vecode】https:\u002F\\u002Fcn\u002Fapp\u002Fvecode\u002Fid?mt=12\n【ToEbook】https:\u002F\\u002Fcn\u002Fapp\u002Ftoebook\u002Fid?mt=8&,&badge&:{&identity&:null,&bestAnswerer&:{&topics&:[{&type&:&topic&,&id&:&&,&name&:&iOS 开发&}],&description&:&优秀回答者&}},&profileUrl&:&https:\u002F\\u002Fpeople\u002Fhuang-jing-cheng&,&avatar&:{&id&:&&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false}},&Comment&:{},&favlists&:{}},&me&:{},&global&:{&experimentFeatures&:{&ge3&:&ge3_9&,&ge2&:&ge2_1&,&nwebStickySidebar&:&sticky&,&androidPassThroughPush&:&getui&,&newMore&:&new&,&liveReviewBuyBar&:&live_review_buy_bar_2&,&liveStore&:&ls_a2_b2_c1_f2&,&searchHybridTabs&:&without-tabs&,&isOffice&:&false&,&homeUi2&:&default&,&answerRelatedReadings&:&qa_recommend_with_ads_and_article&,&remixOneKeyPlayButton&:&headerButton&,&asdfadsf&:&asdfad&,&qrcodeLogin&:&qrcode&,&newBuyBar&:&livenewbuy3&,&isShowUnicomFreeEntry&:&unicom_free_entry_off&,&newMobileColumnAppheader&:&new_header&,&zcmLighting&:&zcm&,&favAct&:&default&,&appStoreRateDialog&:&close&,&mobileQaPageProxyHeifetz&:&m_qa_page_nweb&,&iOSNewestVersion&:&4.2.0&,&default&:&None&,&wechatShareModal&:&wechat_share_modal_show&,&qaStickySidebar&:&sticky_sidebar&,&androidProfilePanel&:&panel_b&,&nwebWriteAnswer&:&default&}},&columns&:{&next&:{},&hjcapple&:{&following&:false,&canManage&:false,&href&:&\u002Fapi\u002Fcolumns\u002Fhjcapple&,&name&:&黄二少碎碎念&,&creator&:{&slug&:&huang-jing-cheng&},&url&:&\u002Fhjcapple&,&slug&:&hjcapple&,&avatar&:{&id&:&02aa7a5bb0cd52f91f4deed1c5066d68&,&template&:&https:\u002F\\u002F{id}_{size}.png&}}},&columnPosts&:{},&columnSettings&:{&colomnAuthor&:[],&uploadAvatarDetails&:&&,&contributeRequests&:[],&contributeRequestsTotalCount&:0,&inviteAuthor&:&&},&postComments&:{},&postReviewComments&:{&comments&:[],&newComments&:[],&hasMore&:true},&favlistsByUser&:{},&favlistRelations&:{},&promotions&:{},&draft&:{&titleImage&:&&,&titleImageSize&:{},&isTitleImageFullScreen&:false,&canTitleImageFullScreen&:false,&title&:&&,&titleImageUploading&:false,&error&:&&,&content&:&&,&draftLoading&:false,&globalLoading&:false,&pendingVideo&:{&resource&:null,&error&:null}},&drafts&:{&draftsList&:[],&next&:{}},&config&:{&userNotBindPhoneTipString&:{}},&recommendPosts&:{&articleRecommendations&:[],&columnRecommendations&:[]},&env&:{&edition&:{},&isAppView&:false,&appViewConfig&:{&content_padding_top&:128,&content_padding_bottom&:56,&content_padding_left&:16,&content_padding_right&:16,&title_font_size&:22,&body_font_size&:16,&is_dark_theme&:false,&can_auto_load_image&:true,&app_info&:&OS=iOS&},&isApp&:false},&message&:{&newCount&:0},&pushNotification&:{&newCount&:0}}

我要回帖

更多关于 安卓手机移动侦测软件 的文章

 

随机推荐