• 苹果IOS设计提出了六大

    一、苹果为IOS的界面设计提出了六大原则: 

    1、整体美学

            整体美学指的是一个应用的表现和行为与它的功能完美集成,传达连贯的信息。

             人们关心一个应用是否提供它承诺的功能,但他们也被应用的外观和行为强烈影响,有时是以潜意识的方式。例如,一个帮助人们执行一个严肃任务的应用,通过采用标准的控制和可预测的行为以及使装饰性的元素隐约和不招摇来使人们聚集于该任务。这样应用的功能和标识就传达了一个清楚的、统一的信息,使人们对它产生信任。

             如果一个应用以打扰、轻浮、武断的方式来呈现一个任务的UI,人们可能怀疑该应用的可靠和是否值得信任。

             换句话说,一个鼓励身临其境的任务例如游戏,人们期待应用令人着迷、具有乐趣和激动人心以及鼓励发现。人们不期待在一个游戏中完成一个严肃性或有生产性任务,人们期待游戏的表现和行为与它的功能一致。

    2、 一致性

           一致性能够让用户在一个应用的部分UI 中学到的知识和技巧转移和应用到另外的部分或者从一个应用转移到另外的应用。一个一致性应用不是其它应用的没有独创性的复制,也不是风格上的不变。而是,它遵守和使用人们熟悉的标准和范例,为用户提供一致的体验。

            为了确定一个IOS应用是否遵守一致性原则,考虑如下问题:

            1)应用是否与IOS标准一致?是否正确使用系统提供的控制、视图和图标?是否以用户期待的方式集成设备的特征?

            2)  应用本身是否一致?文本是否使用了统一的术语和类型?相同的图标是否总是传达相同的意义?在不同位置执行相同的动作的结果是否是可预测的?定制的UI 元素在应用的所有位置是否外观和表现一致?

            3) 应用是否与它的早期版本一致?条款和内容是否维持不变?基础概念和基本功能本质上是否保持不变?

     3、 直接操作

           当人们直接操作屏幕上的对象代替使用分离的控制来操作它们时,人们更能被他们的任务吸引和更容易理解他们动作的结果。

            直接操作是隐式操作的一种,它会让用户觉得可以直接控制计算机显示的对象。

    4 、 反馈

          反馈对用户的动作做出应答,为用户显示动作的结果或持续更新一个任务的执行进程。

           内建的IOS应用对用户动作提供了可预测的反馈。如当用户在列表项和控制上点击时显示一个简短的高亮。在操作的最后执行时间多于几秒时,显示一个流逝的进度。

           精妙的动画能给人们有意义的反馈,帮助人们清楚他们动作的结果。例如,动画一个列表的新行的添加,帮助人们可视跟踪这个改变。

           声音也能给用户提供有用的反馈,但它不应当是仅有的反馈,因为用户不总是能够听到设备的声音。

    5、使用隐喻

          当在一个应用中的虚拟对象和动作隐喻了用户熟悉的体验时,无论这些体验是否来自真实世界或数字世界,用户都能快速掌握如何使用它们。

           最好的情况是一个应用使用隐喻来促进应用的使用而没有使隐喻对对象或动作施加限制。

    6、用户控制

            用户不是应用来启动和控制动作。一个应用能够对动作的进程提供建议或对危险的结果提出警告。但让应用代替用户做出决定通常是错误的。

             好的应用在给用户需要的能力和帮助他们避免不想要的结果之间实现正确的平衡。   

             当应用的行为和控制是熟悉的和可预测时 感觉对应用有更多的控制。当动作是简单和直接的,用户也能理解和记住它们。

             人们期待在一个操作开始之前有更多的机会来取消它。用户期待在执行一个具有潜在破坏动作之前获得机会来确认他们的意图。最后期待能够优雅的停止一个进行中的操作。

    二、谷歌为android系统的界面设计站在人性的角度提出了三大类总共17个原则:

     1.使用户陶醉

        1).以意想不到的方式取悦我

                一个漂亮的界面,一个悉心摆放的动画,或者一个适时的声音效果,都是一种快乐的体验。精细的效果能产生一种轻松的氛围,感觉手中有一股强大可控的力量。

        2).实际对象比按钮和菜单更有趣

                允许人们直接触摸和操作你应用中的对象。它减少了执行一项任务所需的认识上的努力,并使之更加令人舒心。

        3).让我把它变成我的

             人们喜欢加入个人手势,因为这让他们感觉自在与可控。提供可感的、漂亮的默认手势,但也考虑好玩、又不影响主要任务的可选定制项。

        4).学会了解我

             随着时间的推移,学习用户的偏好。将用户先前的选择显示出来,而不是每次让用户做相同的选择。

    2 . 简化我的生活

        1).保持简洁

               使用由简单词汇构成的短句。人们更倾向于跳过过长的句子。

        2).图片比文字更快

             考虑使用图片来解释观点。图片能捕获人们的注意力,往往比文字更有效率。

        3).为我决定,但最终让我说了算

              做最好的猜测,先做而非先问。太多的选择和决定会令人不愉。只在你犯错时,才允许’撤消’。

        4).只在我需要的时候显示我所要的

                当一下子看到太多东西时,人们容易受打击。将任务和信息分解成小的、可消化的片段。隐藏当前非必须的选项,并指导人们如何走下去。

        5).我应该总能知道我在哪里

              给人们知道他们在哪的信心。把应用中的不同场景设计得可区分,并使用过渡来显示不同场景(窗口)之间的关系。提供任务进度反馈。

        6).决不能丢失我的东西

               保存用户花时间创建的东西,使得他们能随处访问。跨手机、平板电脑及计算机等平台,记住设置、个人手势以及作品。这将使得软件升级成为世界上最简单的事。

        7).如果看起来一样,所做的事就该一样

              通过在视觉上加以区别,来帮助人们区分出功能的差异来。避免出现雷同,即看上去一样,但对于同一输入却结果不同。

        8).只在十分重要时打断我

               尤如一个好的个人助理,应该保护上司不被不重要的小事打扰。人们需要专注,除非情况十分严重并且紧急,打扰会是十分令人不悦的。

    3  . 让用户兴奋起来

         1).给我点处处可行的诀窍

            人们如果能够自己探索出东西来,将会兴奋不已。通过使用可视的模式和习惯操作,使你的应用更加易于学习。比如,猛击操作会是一个很好的导航快捷手势。

         2).   不是我的错

            在提示用户改正错误时,应该礼貌。他们在用你应用的时候,需要被认为是聪明的。如果出错了,给出明确的恢复指令,而不是将技术细节留给他们。如果你可以在后台修复错误,那当然最好。

         3).挥洒鼓励

            将复杂的任务分解成小的容易被完成的步骤。对用户的操作给出反馈,即使只是一小步的成功。

        4).为我担负重任 

           通过使他们做成他们认为自己不可能做到的事,让新手感觉自己像专家一样。比如,综合多个照片效果的快捷操作可使得外行简单几步做出惊人的照片效果来。

        5).让重要的事情能更快地完成

           并非所有的操作都是平等的。确定你应用中最重要的操作,使它能很容易地被发现与使用,比如相机上的快门,又如音乐播放器上的暂停按钮。

             

                 以上两个系统的有些原则基本上是相同的,虽然由于出发点不同造成表达方式不同,如苹果的一致性原则基本上与android 提出的让用户兴奋起来中的“给我点处处可行的诀窍”原则类似;反馈原则与挥洒鼓励原则类似;使用隐喻原则基本和“实际对象比按钮和菜单更有趣”原则类似;用户控制原则对应简化我的生活中的为我决定,但最终让我说了算”原则。因此应该说以上的这些原则如 让用户陶醉、兴奋、出乎意料,操作简单、聚集任务、一定的美学要求,让用户控制和直接操作、给用户及时反馈,给用户减负是每个系统的界面设计都应该遵循的,是普遍施用的原则,即任何系统界面设计都应该遵循。

                 

                  

               

            



    展开全文
  • 苹果ios详解

    2012-01-13 19:21:11
    iOS是由苹果公司开发的手持设备操作系统。苹果公司最早于2007年1月9日的Macworld大会上公布这个系统,最初是设计给iPhone使用的,后来陆续套用到iPod touch、iPad以及Apple TV等苹果产品上。iOS苹果的Mac OS X...
     
    

    iOS是由苹果公司开发的手持设备操作系统。苹果公司最早于2007年1月9日的Macworld大会上公布这个系统,最初是设计给iPhone使用的,后来陆续套用到iPod touchiPad以及Apple TV等苹果产品上。iOS与苹果的Mac OS X操作系统一样,它也是以Darwin为基础的,因此同样属于类Unix的商业操作系统。原本这个系统名为iPhone OS,直到2010年6月7日WWDC大会上宣布改名为iOS。截止至2011年11月,根据Canalys的数据显示,iOS已经占据了全球智能手机系统市场份额的30%,在美国的市场占有率为43%。

     

    iOS5系统12项重点更新:

      1、通知中心--整合短信、邮件、通话等多种原生程序通知为一体,同时支持第三方程序的通知。

      2、iBook内支持杂志购买。

      3、Twitter嵌入iOS5系统,用户可以随时将照片等内容直接上传至Twitter,有例如在联系人中可以找到Twitter好友信息。不过这项功能目前在国内还是比较鸡肋的。

      4、Safari浏览器优化--书签里加入了阅读列表功能和标签功能,多个标签之间的切换更自由。

      5、Reminders提醒功能--它可以在多个设备上同步。

      6、相机功能提升--用户可以在不解锁的情况下调用相机,并且可以使用音量键作为相机快门,同时可以在手机上直接处理图片,如消除红眼,调整图片大小等。

      7、Mail--新的邮件功能提供了字典等功能,邮件分类更明确,并且在iPad上,键盘更适合拇指操作。

      8、PC Free无线传输,移动端为ios5的用户可以摆脱数据线,通过Wifi与iTunes同步。

      9、Game Center更新,用户可以在Game Center账号上使用自己的头像,并可以直接在Game Center中购买应用程序。

      10、iMessage--所有ios5用户通过3G或者Wifi进行“短信交流”,俨然一个文字版的“Face Time”。

      11、ipad支持可分离式键盘--可将显示屏上的虚拟键盘在显示屏左下方和右下方分为两部分,更方便于双手打字。

      12. 更新了中文与日文的输入法。

      iphone4s的siri语音控制功能暂时未出现在ios5上。同时支持iOS5的设备有iPhone3GS、iPhone4、iPhone4s、iPad/iPad2,以及三、四代iPod Touch。

      以下是200多项新功能明细:

      全新的锁屏界面

      第一次使用时的崭新欢迎屏幕

      免PC激活(这个功能实在是太好了)

      新的消息推送中心(就是有点像Android的那个)

      锁屏相机快捷方式

      股票和天气内置入消息推送中心

      iPod应用改名为Music并使用了新图标

      新的视频录像应用

      iMessage

      短信发送按钮绿色为普通短信、蓝色为iMessage

      为杂志和报纸新建的Newsstand

      可以创建和删除照片文件夹

      系统级Tωitter支持

      新Tωitter键盘,带有#和@按钮

      支持图片编辑

      Camera相机栅格系统

      New rounded buttons新的圆形图标

      Notification Center支持手动或按时间排列

      可以选择将哪些应用添加到Notifications Center

      可以在设置中为你的设备重新命名

      支持Air Delta Software热更新系统

      用量中显示每个应用对应使用的系统内存

      iTunes无线同步

      密码锁定设置中可开关的语音拨号功能

      支持自定义键盘输入快捷短句功能,比如可以用OMG来代表Oh My God,并可以在任何应用中使用

      New Speak Selection option in Accessibility Settings

      可添加自定义震动模式(这个有什么用?不要胡思乱想!)

      新的触摸辅助设定

      LED闪光灯提醒功能

      选择音频文件的左右音道功能

      设置页面中的新iCloud选项

      在邮件设置中可创建额外的mobileme邮箱

      在邮件设置中可以选择引用级别

      联系人在添加了Tωitter选项

      在设置中可修改本机号码

      在设置中的新Facetime选项,可使用email或电话号码来充当Facetime帐号

      Safari中的隐私浏览选项

      移除当前浏览网站数据

      在设置中可选择开启或关闭iMessage

      可开启Read Receipts

      iMessage不能使用时自动以短信形式发送

      可以设置新消息提醒后,未阅读的旧消息还将提醒多少次

      音乐和视频应用设置分离

      Photo Stream

      设置备忘同步的默认帐号

      可选择自动下载功能开启或关闭

      设置仅连接到WiFi时才开始自动下载

      地图中的可选路线功能

      App Store中的购买历史功能

      可以删除单条通话记录

      iCloud备份

      使用音量键拍照

      在音乐应用中点击并按住一首歌,会显示该歌曲的全部信息

      发邮件时可拖动联系人添加到邮件发送列表

      发邮件时若没有添加标题,会在发送前提醒

      在邮件中更新了Windows Live Mail、Gmail和Exchange等小图标

      富本文邮件编辑

      系统词典功能

      地图中的打印功能

      地图中可隐藏路况

      可为每个联系人定制震动类型

      备忘中显示条数

      设置中添加了帮助链接

      Game Center中添加图片

      Game Center中添加隐私选项,可选择保密或者公开个人资料

      Game Center主页中显示个人游戏分数

      可看分数分组Game Center好友

      Game Center中的好友推荐功能

      新游戏可以通过Game Center来下载

      Game Center中的游戏推荐功能

      Game Center新的好友请求页面

      语音备忘录中可以向各个方向旋转

      为不同的联系人选择不同的短信提示音

      天气应用中的本地功能

      天气应用以小时为单位更新

      Safari中的阅读列表功能

      iPad Safari中的标签功能

      Reader view which removes all clutter from web pages on iPad

      iPad分离式键盘

      AirPlay Mirroring

      与iTunes同步时仍可使用iphone

      支持Emoji表情

      支持在iOS上发推时发送链接和图片

      横屏iCal时以周为单位显示

      iPad上的新音乐应用

      iCloud同步和备份文档功能

      Safari地址栏右侧轻微的淡出效果(这个可能翻译不是很准备,欢迎纠正)

      基于地址位置的提醒功能

      VoiceOver支持阿拉伯语

      可后台打开链接

      支持Tωitter头像导入到联系人头像

      iPad 2原生1080p视频播放

      日本等地区的日历支持

      iPad cal中支持年度显示

      Game Center中支持回合制游戏

      邮件全文搜索功能

      邮件应用中的高级控制

      Safari中可删除单个网站的数据,比如Cookies……iOS 5联系人支持Tωitter、Facebook、Flickr、LinkedIn和Myspace

      iPad键盘上增加页面搜索按钮

      个人热点功能移入设置-网络选项中

      iMessages支持GIF动态图片发送功能

      在日历中双击日期也可以添加备忘

      在日历中点击并拖动事件功能

      在日历中点击并按住全天事件来创建新的全天事件

      Tωitter如果没有下载,可以在Settings中下载(设置里),甚至不用去App Store

      Hotmail邮件支持

      iPod touch可在iOS 5中自由设置时间

      在iPad的Safari中点击并按住向后箭头,可显示要返回的网页列表

      Safari隐私浏览时,颜色由蓝色变为黑色

      自动修正功能可单独关闭,而不是随着拼写检查功能一起关闭

      添加相关联系人,比如父母兄弟姐妹等

      音量键也可以用于视频录制时的开始和结束控制

      在设置-通用-密码锁定中,增加了一项与应用购买相关的密码锁定功能

      AppStore应用列表中已购买应用显示价龘格的地方变为“安装”或Install。

      在AppStore中添加了iForgot功能,以便忘记Apple ID、密码的朋友找回密码

      蓝牙显示远程播放的音乐信息

      现在的打盹儿功能(就是再睡一会儿)可以在锁屏状态下滑动来控制

      可设置多个Tωitter帐号并选择使用哪一个帐号来发推

      删除每一个应用的数据

      iTunes铃声商店

      实时股价

      VoiceOver项目选择

      语音短信选项

      锁屏状态下切换到静音模式时,音量条仍然显示

      可选择多个邮件并标记为已读

      可同时下载多个应用,而不必等到一个应用下载完成后才开始另一个应用的下载

      可选择是否在消息推送中心显示天气和股票

      语音控制中,增加了新的声音

      可以设置消息推送提醒中心的应用行为,比如让天气一直处于顶端、然后是短信等等……

      邮件中的最大消息下载数字从250增加到1000

      Google Maps中添加链接

      观看YouTube视频时双击Home键显示视频上传者信息

      Y0uTube视频标题滚动

      Time mid-call invitation alerts

      在iOS设备上设置Airport和Time Capsule

      打电话时显示FaceTime视频电话插入提示

      支持使用不同的Apple ID

      锁屏时收到推送提醒时,横扫屏幕即可进入相应的应用

      在消息推送中心的天气应用上横扫屏幕即可查看未来五天的天气情况

      iPad上的手势功能

      邮件中的S/MIME文件类型支持

      Facetime可以在没有SIM卡的iPhone上使用了(需要使用电子邮件地址)

      收到非联系人名单中的来电时,主屏幕也会显示城市名。如果可以识别,还会显示地区和国家名。

      拍照时,在相机应用内点击并按住,即可选择开关AE/AF。

      拍照时,使用两指靠近或分离触摸,即可控制焦距。

      在日历的按月浏览模式中,按下侧面的+号来添加事件,也可以点击并按住日期来添加事件。

      天气应用中使用本地信息

      邮件中可为邮件设置小旗子

      在设置中可以选择Safari点击并按住对应的选项

      在iPad的日历上可以通过左右横扫屏幕来更改当前查看的月份

      横扫删除音乐

      iCloud中的购买更多空间功能

      可为消息、语音邮件、普通邮件和发送邮件设置自定义声音

      在离线辞典中设置自定义词组

      应用崩溃时淡出,而不是突然消失,也就是说,死也要华丽的死去……

    展开全文
  • 程序中调用系统相机拍照的时候必须长按才能拍照,点击不能拍照,程序原先好好的,突然就不能拍照了. 原因是: 项目中添加了类 #import "UIButton+FixMultiClick.h", 该扩展类目的是防止 button 连续点击...

    程序中调用系统相机拍照的时候必须长按才能拍照,点击不能拍照,程序原先好好的,突然就不能拍照了.

    原因是: 项目中添加了类 #import "UIButton+FixMultiClick.h", 该扩展类目的是防止 button 连续点击.

    问题修改方法: 在扩展类中的添加判断,如果是拍摄按钮点击事件则不执行连续点击判断. 代码如下:

    - (void)mjk_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event {

        /**

         *  SEL 变量名 = NSSelectorFromString(方法名字的字符串);

         *  NSString *method = NSStringFromSelector(setWidthHeight)

         */

        NSString *method = NSStringFromSelector(action);

        

        if ([method isEqualToString:@"_pressedButton:"]) {

            NSLog(@"******************>>> _pressedButton: <<<************");

            [self mjk_sendAction:action to:target forEvent:event];

            return;

        }

        

        // 如果是 点击相机拍照按钮事件则不判断是否连续点击.

        if ([method isEqualToString:@"_handleShutterButtonPressed:"]) {

            // handle Shutter Button Pressed 手柄快门按钮按下 (点击相机拍照按钮)

            NSLog(@"******************>>> _handleShutterButtonPressed: <<<************");

            [self mjk_sendAction:action to:target forEvent:event];

            return;

        }

        

        NSTimeInterval time = self.mjk_acceptEventInterval;

        if (time <= 0.0) {

            time = DEFAULT_ACCEPT_EVENT_INTERVAL;

            self.mjk_acceptEventInterval = time;

        }

        

        if ([NSDate date].timeIntervalSince1970 - self.mjk_acceptEventTime < time) {

            return;

        }

        

        // 第一次点击的时间

        self.mjk_acceptEventTime = [NSDate date].timeIntervalSince1970;

        

        [self mjk_sendAction:action to:target forEvent:event];

    }

     

    防止按钮重复点击代码,下载地址:https://download.csdn.net/download/pjc6362645/10922812

    展开全文
  • (转)iOS 上的相机捕捉

    2016-03-17 14:37:04
    在第一个 SKDs 版本中,在 app 里面整合相机的唯一方法就是使用 UIImagePickerController,但到了 iOS 4,发布了更灵活的 AVFoundation 框架。 在这篇文章里,我们将会看到如何使用 AVFoundation 捕捉图像,如何操控...

    出处:http://www.objccn.io/issue-21-3/

    第一台 iPhone 问世就装有相机。在第一个 SKDs 版本中,在 app 里面整合相机的唯一方法就是使用 UIImagePickerController,但到了 iOS 4,发布了更灵活的 AVFoundation 框架。

    在这篇文章里,我们将会看到如何使用 AVFoundation 捕捉图像,如何操控相机,以及它在 iOS 8 的新特性。

    概述

    AVFoundation vs. UIImagePickerController

    UIImagePickerController 提供了一种非常简单的拍照方法。它支持所有的基本功能,比如切换到前置摄像头,开关闪光灯,点击屏幕区域实现对焦和曝光,以及在 iOS 8 中像系统照相机应用一样调整曝光。

    然而,当有直接访问相机的需求时,也可以选择 AVFoundation 框架。它提供了完全的操作权,例如,以编程方式更改硬件参数,或者操纵实时预览图。

    AVFoundation 相关类

    AVFoundation 框架基于以下几个类实现图像捕捉 ,通过这些类可以访问来自相机设备的原始数据并控制它的组件。

    • AVCaptureDevice 是关于相机硬件的接口。它被用于控制硬件特性,诸如镜头的位置、曝光、闪光灯等。
    • AVCaptureDeviceInput 提供来自设备的数据。
    • AVCaptureOutput 是一个抽象类,描述 capture session 的结果。以下是三种关于静态图片捕捉的具体子类:
      • AVCaptureStillImageOutput 用于捕捉静态图片
      • AVCaptureMetadataOutput 启用检测人脸和二维码
      • AVCaptureVideoOutput 为实时预览图提供原始帧
    • AVCaptureSession 管理输入与输出之间的数据流,以及在出现问题时生成运行时错误。
    • AVCaptureVideoPreviewLayerCALayer 的子类,可被用于自动显示相机产生的实时图像。它还有几个工具性质的方法,可将 layer 上的坐标转化到设备上。它看起来像输出,但其实不是。另外,它拥有 session (outputs 被 session所拥有)。

    设置

    让我们看看如何捕获图像。首先我们需要一个 AVCaptureSession 对象:

    let session = AVCaptureSession()  
    

    现在我们需要一个相机设备输入。在大多数 iPhone 和 iPad 中,我们可以选择后置摄像头或前置摄像头 -- 又称自拍相机 (selfie camera) -- 之一。那么我们必须先遍历所有能提供视频数据的设备 (麦克风也属于AVCaptureDevice,因此略过不谈),并检查position 属性:

    let availableCameraDevices = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo)  
    for device in availableCameraDevices as [AVCaptureDevice] {  
      if device.position == .Back {
        backCameraDevice = device
      }
      else if device.position == .Front {
        frontCameraDevice = device
      }
    }

    然后,一旦我们发现合适的相机设备,我们就能获得相关的 AVCaptureDeviceInput 对象。我们会将它设置为 session 的输入:
    var error:NSError?  
    let possibleCameraInput: AnyObject? = AVCaptureDeviceInput.deviceInputWithDevice(backCameraDevice, error: &error)  
    if let backCameraInput = possibleCameraInput as? AVCaptureDeviceInput {  
      if self.session.canAddInput(backCameraInput) {
        self.session.addInput(backCameraInput)
      }
    }
    注意当 app 首次运行时,第一次调用 AVCaptureDeviceInput.deviceInputWithDevice() 会触发系统提示,向用户请求访问相机。这在 iOS 7 的时候只有部分国家会有,到了 iOS 8 拓展到了所有地区。除非得到用户同意,否则相机的输入会一直是一个黑色画面的数据流。

    对于处理相机的权限,更合适的方法是先确认当前的授权状态。要是在授权还没有确定的情况下 (也就是说用户还没有看过弹出的授权对话框时),我们应该明确地发起请求。

    let authorizationStatus = AVCaptureDevice.authorizationStatusForMediaType(AVMediaTypeVideo)  
    switch authorizationStatus {  
    case .NotDetermined:  
      // 许可对话没有出现,发起授权许可
      AVCaptureDevice.requestAccessForMediaType(AVMediaTypeVideo,
        completionHandler: { (granted:Bool) -> Void in
        if granted {
          // 继续
        }
        else {
          // 用户拒绝,无法继续
        }
      })
    case .Authorized:  
      // 继续
    case .Denied, .Restricted:  
      // 用户明确地拒绝授权,或者相机设备无法访问
    }
    如果能继续的话,我们会有两种方式来显示来自相机的图像流。最简单的就是,生成一个带有 AVCaptureVideoPreviewLayer 的 view,并使用 capture session 作为初始化参数。
    previewLayer = AVCaptureVideoPreviewLayer.layerWithSession(session) as AVCaptureVideoPreviewLayer  
    previewLayer.frame = view.bounds  
    view.layer.addSublayer(previewLayer)  
    AVCaptureVideoPreviewLayer 会自动地显示来自相机的输出。当我们需要将实时预览图上的点击转换到设备的坐标系统中,比如点击某区域实现对焦时,这种做法会很容易办到。之后我们会看到具体细节。

    第二种方法是从输出数据流捕捉单一的图像帧,并使用 OpenGL 手动地把它们显示在 view 上。这有点复杂,但是如果我们想要对实时预览图进行操作或使用滤镜的话,就是必要的了。

    为获得数据流,我们需要创建一个 AVCaptureVideoDataOutput,这样一来,当相机在运行时,我们通过代理方法 captureOutput(_:didOutputSampleBuffer:fromConnection:) 就能获得所有图像帧 (除非我们处理太慢而导致掉帧),然后将它们绘制在一个GLKView 中。不需要对 OpenGL 框架有什么深刻的理解,我们只需要这样就能创建一个GLKView

    glContext = EAGLContext(API: .OpenGLES2)  
    glView = GLKView(frame: viewFrame, context: glContext)  
    ciContext = CIContext(EAGLContext: glContext)  
    现在轮到 AVCaptureVideoOutput
    videoOutput = AVCaptureVideoDataOutput()  
    videoOutput.setSampleBufferDelegate(self, queue: dispatch_queue_create("sample buffer delegate", DISPATCH_QUEUE_SERIAL))  
    if session.canAddOutput(self.videoOutput) {  
      session.addOutput(self.videoOutput)
    }
    以及代理方法:
    func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) {  
      let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
      let image = CIImage(CVPixelBuffer: pixelBuffer)
      if glContext != EAGLContext.currentContext() {
        EAGLContext.setCurrentContext(glContext)
      }
      glView.bindDrawable()
      ciContext.drawImage(image, inRect:image.extent(), fromRect: image.extent())
      glView.display()
    }
    一个警告:这些来自相机的样本旋转了 90 度,这是由于相机传感器的朝向所导致的。AVCaptureVideoPreviewLayer 会自动处理这种情况,但在这个例子,我们需要对GLKView 进行旋转。

    马上就要搞定了。最后一个组件 -- AVCaptureStillImageOutput -- 实际上是最重要的,因为它允许我们捕捉静态图片。只需要创建一个实例,并添加到 session 里去:

    stillCameraOutput = AVCaptureStillImageOutput()  
    if self.session.canAddOutput(self.stillCameraOutput) {  
      self.session.addOutput(self.stillCameraOutput)
    }
    配置

    现在我们有了所有必需的对象,应该为我们的需求寻找最合适的配置。这里又有两种方法可以实现。最简单且最推荐是使用 session preset:

    session.sessionPreset = AVCaptureSessionPresetPhoto  
    AVCaptureSessionPresetPhoto 会为照片捕捉选择最合适的配置,比如它可以允许我们使用最高的感光度 (ISO) 和曝光时间,基于相位检测 (phase detection)的自动对焦, 以及输出全分辨率的 JPEG 格式压缩的静态图片。

    然而,如果你需要更多的操控,可以使用 AVCaptureDeviceFormat 这个类,它描述了一些设备使用的参数,比如静态图片分辨率,视频预览分辨率,自动对焦类型,感光度和曝光时间限制等。每个设备支持的格式都列在AVCaptureDevice.formats 属性中,并可以赋值给AVCaptureDeviceactiveFormat (注意你并不能修改格式)。

    操作相机

    iPhone 和 iPad 中内置的相机或多或少跟其他相机有相同的操作,不同的是,一些参数如对焦、曝光时间 (在单反相机上的模拟快门的速度),感光度是可以调节,但是镜头光圈是固定不可调整的。到了 iOS 8,我们已经可以对所有这些可变参数进行手动调整了。

    我们之后会看到细节,不过首先,该启动相机了:

    sessionQueue = dispatch_queue_create("com.example.camera.capture_session", DISPATCH_QUEUE_SERIAL)  
    dispatch_async(sessionQueue) { () -> Void in  
      self.session.startRunning()
    }
    在 session 和相机设备中完成的所有操作和配置都是利用 block 调用的。因此,建议将这些操作分配到后台的串行队列中。此外,相机设备在改变某些参数前必须先锁定,直到改变结束才能解锁,例如:
    var error:NSError?  
    if currentDevice.lockForConfiguration(&error) {  
      // 锁定成功,继续配置
      // currentDevice.unlockForConfiguration()
    }
    else {  
      // 出错,相机可能已经被锁
    }<code class=" hljs javascript">
    </code>

    对焦

    在 iOS 相机上,对焦是通过移动镜片改变其到传感器之间的距离实现的。

    自动对焦是通过相位检测和反差检测实现的。然而,反差检测只适用于低分辨率和高 FPS 视频捕捉 (慢镜头)。

    编者注 关于相位对焦和反差对焦,可以参看这篇文章

    AVCaptureFocusMode 是个枚举,描述了可用的对焦模式:

    • Locked 指镜片处于固定位置
    • AutoFocus 指一开始相机会先自动对焦一次,然后便处于 Locked 模式。
    • ContinuousAutoFocus 指当场景改变,相机会自动重新对焦到画面的中心点。

    设置想要的对焦模式必须在锁定之后实施:

    let focusMode:AVCaptureFocusMode = ...  
    if currentCameraDevice.isFocusModeSupported(focusMode) {  
      ... // 锁定以进行配置
      currentCameraDevice.focusMode = focusMode
      ... // 解锁
      }
    }<code class=" hljs javascript">
    </code>

    通常情况下,AutoFocus 模式会试图让屏幕中心成为最清晰的区域,但是也可以通过变换 “感兴趣的点 (point of interest)” 来设定另一个区域。这个点是一个 CGPoint,它的值从左上角{0,0} 到右下角{1,1}{0.5,0.5} 为画面的中心点。通常可以用视频预览图上的点击手势识别来改变这个点,想要将 view 上的坐标转化到设备上的规范坐标,我们可以使用AVVideoCaptureVideoPreviewLayer.captureDevicePointOfInterestForPoint()

    var pointInPreview = focusTapGR.locationInView(focusTapGR.view)  
    var pointInCamera = previewLayer.captureDevicePointOfInterestForPoint(pointInPreview)  
    ...// 锁定,配置
    
    // 设置感兴趣的点
    currentCameraDevice.focusPointOfInterest = pointInCamera
    
    // 在设置的点上切换成自动对焦
    currentCameraDevice.focusMode = .AutoFocus
    
    ...// 解锁
    <code class=" hljs javascript"><span class="hljs-comment"></span>
    </code>

    在 iOS 8 中,有个新选项可以移动镜片的位置,从较近物体的 0.0 到较远物体的 1.0 (不是指无限远)。

    ... // 锁定,配置
    var lensPosition:Float = ... // 0.0 到 1.0的float  
    currentCameraDevice.setFocusModeLockedWithLensPosition(lensPosition) {  
      (timestamp:CMTime) -> Void in
      // timestamp 对应于应用了镜片位置的第一张图像缓存区
    }
    ... // 解锁<code class=" hljs javascript"><span class="hljs-comment"></span>
    </code>

    这意味着对焦可以使用 UISlider 设置,这有点类似于旋转单反上的对焦环。当用这种相机手动对焦时,通常有一个可见的辅助标识指向清晰的区域。AVFoundation 里面没有内置这种机制,但是比如可以通过显示"对焦峰值 (focus peaking)"(一种将已对焦区域高亮显示的方式) 这样的手段来补救。我们在这里不会讨论细节,不过对焦峰值可以很容易地实现,通过使用阈值边缘 (threshold edge) 滤镜 (用自定义CIFilter GPUImageThresholdEdgeDetectionFilter),并调用 AVCaptureAudioDataOutputSampleBufferDelegate 下的captureOutput(_:didOutputSampleBuffer:fromConnection:) 方法将它覆盖到实时预览图上。

    曝光

    在 iOS 设备上,镜头上的光圈是固定的 (在 iPhone 5s 以及其之后的光圈值是 f/2.2,之前的是 f/2.4),因此只有改变曝光时间和传感器的灵敏度才能对图片的亮度进行调整,从而达到合适的效果。至于对焦,我们可以选择连续自动曝光,在“感兴趣的点”一次性自动曝光,或者手动曝光。除了指定“感兴趣的点”,我们可以通过设置曝光补偿 (compensation) 修改自动曝光,也就是曝光档位的目标偏移。目标偏移在曝光档数里有讲到,它的范围在minExposureTargetBiasmaxExposureTargetBias 之间,0为默认值 (即没有“补偿”)。

    var exposureBias:Float = ... // 在 minExposureTargetBias 和 maxExposureTargetBias 之间的值  
    ... // 锁定,配置
    currentDevice.setExposureTargetBias(exposureBias) { (time:CMTime) -> Void in  
    }
    ... // 解锁<code class=" hljs javascript"><span class="hljs-comment"></span></code>

    使用手动曝光,我们可以设置 ISO 和曝光时间,两者的值都必须在设备当前格式所指定的范围内。

    var activeFormat = currentDevice.activeFormat  
    var duration:CTime = ... //在activeFormat.minExposureDuration 和 activeFormat.maxExposureDuration 之间的值,或用 AVCaptureExposureDurationCurrent 表示不变  
    var iso:Float = ... // 在 activeFormat.minISO 和 activeFormat.maxISO 之间的值,或用 AVCaptureISOCurrent 表示不变  
    ... // 锁定,配置
    currentDevice.setExposureModeCustomWithDuration(duration, ISO: iso) { (time:CMTime) -> Void in  
    }
    ... // 解锁<code class=" hljs javascript"><span class="hljs-comment"></span></code>

    如何知道照片曝光是否正确呢?我们可以通过 KVO,观察 AVCaptureDeviceexposureTargetOffset 属性,确认是否在 0 附近。

    白平衡

    数码相机为了适应不同类型的光照条件需要补偿。这意味着在冷光线的条件下,传感器应该增强红色部分,而在暖光线下增强蓝色部分。在 iPhone 相机中,设备会自动决定合适的补光,但有时也会被场景的颜色所混淆失效。幸运地是,iOS 8 可以里手动控制白平衡。

    自动模式工作方式和对焦、曝光的方式一样,但是没有“感兴趣的点”,整张图像都会被纳入考虑范围。在手动模式,我们可以通过开尔文所表示的温度来调节色温和色彩。典型的色温值在 2000-3000K (类似蜡烛或灯泡的暖光源) 到 8000K (纯净的蓝色天空) 之间。色彩范围从最小的 -150 (偏绿) 到 150 (偏品红)。

    温度和色彩可以被用于计算来自相机传感器的恰当的 RGB 值,因此仅当它们做了基于设备的校正后才能被设置。

    以下是全部过程:

    var incandescentLightCompensation = 3_000  
    var tint = 0 // 不调节  
    let temperatureAndTintValues = AVCaptureWhiteBalanceTemperatureAndTintValues(temperature: incandescentLightCompensation, tint: tint)  
    var deviceGains = currentCameraDevice.deviceWhiteBalanceGainsForTemperatureAndTintValues(temperatureAndTintValues)  
    ... // 锁定,配置
    currentCameraDevice.setWhiteBalanceModeLockedWithDeviceWhiteBalanceGains(deviceGains) {  
            (timestamp:CMTime) -> Void in
        }
      }
    ... // 解锁<code class=" hljs javascript"><span class="hljs-comment"></span></code>

    实时人脸检测

    AVCaptureMetadataOutput 可以用于检测人脸和二维码这两种物体。很明显,没什么人用二维码 (编者注: 因为在欧美现在二维码不是很流行,这里是一个恶搞。链接的这个 tumblr 博客的主题是 “当人们在扫二维码时的图片”,但是 2012 年开博至今没有任何一张图片,暗讽二维码根本没人在用,这和以中日韩为代表的亚洲用户群体的使用习惯完全相悖),因此我们就来看看如何实现人脸检测。我们只需通过AVCaptureMetadataOutput 的代理方法捕获的元对象:

    var metadataOutput = AVCaptureMetadataOutput()  
    metadataOutput.setMetadataObjectsDelegate(self, queue: self.sessionQueue)  
    if session.canAddOutput(metadataOutput) {  
      session.addOutput(metadataOutput)
    }
    metadataOutput.metadataObjectTypes = [AVMetadataObjectTypeFace]  
    
    func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {  
        for metadataObject in metadataObjects as [AVMetadataObject] {
          if metadataObject.type == AVMetadataObjectTypeFace {
            var transformedMetadataObject = previewLayer.transformedMetadataObjectForMetadataObject(metadataObject)
          }
        }
    

    更多关于人脸检测与识别的内容请查看 Engin 的文章

    捕捉静态图片

    最后,我们要做的是捕捉高分辨率的图像,于是我们调用 captureStillImageAsynchronouslyFromConnection(connection, completionHandler)。在数据时被读取时,completion handler 将会在某个未指定的线程上被调用。

    如果设置使用 JPEG 编码作为静态图片输出,不管是通过 session .Photo 预设设定的,还是通过设备输出设置设定的,sampleBuffer 都会返回包含图像的元数据。如果在AVCaptureMetadataOutput 中是可用的话,这会包含 EXIF 数据,或是被识别的人脸等:

    dispatch_async(sessionQueue) { () -> Void in
    
      let connection = self.stillCameraOutput.connectionWithMediaType(AVMediaTypeVideo)
    
      // 将视频的旋转与设备同步
      connection.videoOrientation = AVCaptureVideoOrientation(rawValue: UIDevice.currentDevice().orientation.rawValue)!
    
      self.stillCameraOutput.captureStillImageAsynchronouslyFromConnection(connection) {
        (imageDataSampleBuffer, error) -> Void in
    
        if error == nil {
    
          // 如果使用 session .Photo 预设,或者在设备输出设置中明确进行了设置
          // 我们就能获得已经压缩为JPEG的数据
    
          let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataSampleBuffer)
    
          // 样本缓冲区也包含元数据,我们甚至可以按需修改它
    
          let metadata:NSDictionary = CMCopyDictionaryOfAttachments(nil, imageDataSampleBuffer, CMAttachmentMode(kCMAttachmentMode_ShouldPropagate)).takeUnretainedValue()
    
          if let image = UIImage(data: imageData) {
            // 保存图片,或者做些其他想做的事情
            ...
          }
        }
        else {
          NSLog("error while capturing still image: \(error)")
        }
      }
    }<code class=" hljs swift">
    </code>

    当图片被捕捉的时候,有视觉上的反馈是很好的体验。想要知道何时开始以及何时结束的话,可以使用 KVO 来观察 AVCaptureStillImageOutputisCapturingStillImage 属性。

    分级捕捉

    在 iOS 8 还有一个有趣的特性叫“分级捕捉”,可以在不同的曝光设置下拍摄几张照片。这在复杂的光线下拍照显得非常有用,例如,通过设定 -1、0、1 三个不同的曝光档数,然后用 HDR 算法合并成一张。

    以下是代码实现:

    dispatch_async(sessionQueue) { () -> Void in  
      let connection = self.stillCameraOutput.connectionWithMediaType(AVMediaTypeVideo)
      connection.videoOrientation = AVCaptureVideoOrientation(rawValue: UIDevice.currentDevice().orientation.rawValue)!
    
      var settings = [-1.0, 0.0, 1.0].map {
        (bias:Float) -> AVCaptureAutoExposureBracketedStillImageSettings in
    
        AVCaptureAutoExposureBracketedStillImageSettings.autoExposureSettingsWithExposureTargetBias(bias)
      }
    
      var counter = settings.count
    
      self.stillCameraOutput.captureStillImageBracketAsynchronouslyFromConnection(connection, withSettingsArray: settings) {
        (sampleBuffer, settings, error) -> Void in
    
        ...
        // 保存 sampleBuffer(s)
    
        // 当计数为0,捕捉完成
        counter--
    
      }
    }<code class=" hljs swift">
    </code>

    这很像是单个图像捕捉,但是不同的是 completion handler 被调用的次数和设置的数组的元素个数一样多。

    总结

    我们已经详细看到如何在 iPhone 应用里面实现拍照的基础功能(呃…不光是 iPhone,用 iPad 拍照其实也是不错的)。你也可以查看这个例子。最后说下,iOS 8 允许更精确的捕捉,特别是对于高级用户,这使得 iPhone 与专业相机之间的差距缩小,至少在手动控制上。不过,不是任何人都喜欢在日常拍照时使用复杂的手动操作界面,因此请合理地使用这些特性。

    展开全文
  • 产品特点:本ic安卓苹果通用,板子体积小,元件少,大大节约成本。无论您是给别人拍照还是给自己拍照或是旅游自拍,各种姿势自拍,轻松达到完美效果。 适用机型:i5,i4, iP4S, 3GS,iPad 2 , iPad 3 ,iPad4,iPad...

    产品特点:本ic安卓苹果通用,板子体积小,元件少,大大节约成本。无论您是给别人拍照还是给自己拍照或是旅游自拍,各种姿势自拍,轻松达到完美效果。
    适用机型:i5,i4, iP4S, 3GS,iPad 2 , iPad 3 ,iPad4,iPad Mini(ios 5.0.1, ios 5.1or above)注:必须是ios5.0以上版本

    iP/iPod手机快门线 1) 使用前先将快门线插头插入iP4, iPad的3.5mm插孔 2)安全按下快门释放按键,释放相机快门进行拍照. 3)使用此相机线拍出来的照片更加清晰,避免了因为手抖动而造成的图片不清晰。 4)支持iPhone6、5S、5、4s 4, iPad 2 3…… 安卓苹果通用有线自拍杆,自拍神器 安卓苹果通用带线手持拍照伸缩杆,小米三星华为苹果通用自拍杆,安卓4.2.2以上系统,如果不能够使用,请下载相机360,iphone ios5.01以上版本,无需下载软件,直接将线插入手机音频口,就可以控制手机相机拍照,使用方便简单,无需充电。

    详情请咨询qq:1205847825  

    TEL:13632621646 范生  欢迎来电索取样品及相关资料

    展开全文
  • 苹果手机靠着它优异的手机性能风靡全球,独有的IOS系统让苹果手机使用起来更加的流畅,苹果公司对拍照的后期处理数据做的非常好,这使得苹果手机拍出来的照片别有一番特色,很多小伙伴用了那么久的苹果手机,对拍照...
  • 快速地同时按下home键(手机下方那个圆键)和开机键,要速度很快的同时按一下,会听到轻微的类似照相机快门声音,同时屏幕会有短暂的白屏,这时你的画面已经被保存下来,在手机上的“照片”项里可以看到你的截屏...
  • 据国外媒体报道,iOS 5更新已全面开放,新版操作系统适合所有苹果iPhone、iPad、iPod touch设备。iOS 5是苹果公司自09年发布iPhone OS 3操作系统以来最大的一次更新,带来超过200个新功能。 这些新功能中包含一些...
  • 实际上Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时录制的声音以及GPS全球定位系统数据、缩略图等...
  • 苹果iOS是由苹果公司开发的手持设备操作系统。苹果公司最早于2007年1月9日的Macworld大会上公布这个系统,最初是设计给iPhone使用的,后来陆续套用到iPodtouch、iPad以及AppleTV等苹果产品上。iOS与苹果的MacOSX操作...
  • iOS照片框架

    2016-07-12 14:18:48
    原文地址:iOS照片框架 介绍 每天,用 iPhone 拍摄的照片数量超过了任何相机。每年 iOS 设备上的显示效果变得越来越好,回到 iPad 刚出现还没有 Retina 显示屏的时代,大屏幕的杀手级功能之一就是可以...
  • 自从2007年1月9日乔布斯推出iPhone后的六年多时间来,iPhone、...时间过得真快,转眼iOS已经成为至今仍在活跃的最老移动操作系统 之一。最老并不是代表它已经老弱病残,恰恰相反,它迎来一个又一个更新,逐渐成
  • 来源于:http://news.newhua.com/news/2011/1010/134043.shtml 苹果将于10月12日开放其全新操作系统iOS 5的更新,此新版本适用于iPhone,iPad 和 iPod Touch。经过反复修缮,层层把关之后的正式版本,带
  • 评论了iOS 5带来iPhone 4十大打手改进 毫无疑问,iPhone是目前世界上最常用来拍摄数码照片的工具,虽然有无数的照片应用程序,以提高你的iPhone摄像头的性能,但最常用的是苹果用自己的相机。和苹果意识到了iOS系统...
  • 前段时间遇到一个需求,...一顿Google,发现图像预览、人脸识别、二维码识别这些苹果都帮我们做好了,而且它们都是基于AVFoundation框架实现的。 话不多说,上代码~! 用到的类,主要有这些: //硬件设备 @property
  • 苹果新的iOS 4.3。 0您的迎了上来年级有苹果iPad平板电脑,iPhone 4 苹果的厨房区更新,意味着新的iOS 4,提供周三(几天以前预见的),配有多种变化或新的功能就为i手机,iPad的小册子,因此iPod的iTouch的董事,此外...
  • IOS

    2012-07-25 22:15:22
    苹果iOS是由苹果公司开发的手持设备操作系统。苹果公司最早于2007年1月9日的Macworld大会上公布这个系统,最初是设计给iPhone使用的,后来陆续套用到iPod touch、iPad以及Apple TV等苹果产品上。iOS与苹果的Mac OS...
  • 教程指导 苹果官方教程:用户界面设计 ...iOS 动画总结----UIView动画  ...IOS开发之纯代码界面--基本...照相机快门动画(已更新,流畅)-快门组件依次层叠,跟系统一样的动画效果 类似建设银行客户端 图标随之
1 2 3 4 5 ... 8
收藏数 152
精华内容 60