zoukankan      html  css  js  c++  java
  • 充電方式

    標準充電方式 

     
    當電池電量剩下約 15% 左右就要準備接電源充電了,剩 10% 時會有電量過低警示。 
     
    補充:沒有必要等到電池完全沒電時才充電,因為鋰電池本來就是設計給用戶隨時可補充電力用的。另外就是避免電池電量出現在 100% 或 0% 這兩個極端值,如果電量長期在 100% 不放電,會讓鋰電子沒有地方可以活動,一段時間後,你的鋰電池可能就會流「湯」出來喔!如果電量只有 0%,那將可能會造成電池陷入深度放電狀態,這樣會讓它永遠無法再蓄電。 
     
     
     
    電池校正方式 
     
    以下電池校正資訊來源為 Apple,適用於 PowerBook G4 (15 吋、雙層 SD)、MacBook (所有機型)、MacBook Pro (所有機型)、MacBook Pro (17 吋) (所有機型) 以及 MacBook Air。 
     
     1. 插入電源轉換器並充足 PowerBook 電池的電力,直到電源轉換器上的指示燈或 LED 變成綠色,且選單列中 
     
       的螢幕計量器指出電池已充足電為止。 
     
     2. 讓電池保持在充足電力的狀態下至少兩小時。在此期間只要插上電源轉換器,仍然可以使用電腦。 
     
     3. 在電腦的電源仍開啟時拔除電源轉換器,開始使用電池的電力讓電腦運轉。您可在這段時間內使用電腦。 
     
       電池電力降低時,螢幕上會出現電池電力不足的警告對話框。 
     
     4. 這時請儲存所有工作。請繼續使用電腦。如果電池電力非常低,電腦會自動進入睡眠狀態。 
     
     5. 關閉電腦,或讓電腦處於睡眠狀態至少五小時。 
     
     6. 接上電源轉換器,在電池再次充足電力之前都不要將其拔除。 
     
    注意:電池校正約一個月做一次或 30 個充電循環做一次即可,常常校正可能會對電池產生不良影響。 
     
    補充:電池具有內部微處理器,在充電及放電時,提供電池中電源的預估值。有時需要重新校準電池,以保持螢幕上顯示的電池時間及百分比能夠精確,並讓電池的效率保持在最佳狀態。第一次使用電腦以及其後每隔幾個月都應該執行這道程序。如果您的 Apple 可攜式電腦通常接上交流電電源,很少使用電池電力,則最好每個月執行一次。www.apple.com/tw/batteries 網站提供更多和電池有關的輔助資訊,也提供 iCal 行事曆,可提醒您要校正電池。 
     
     
     
    電池長壽秘技 
     
    1. 照上述方法為電池做充放電,每週固定有一兩天讓電池正常充放電,定期做電池校正。 
     
      時常讓電池內的鋰電子保持在活性狀態,電池才會健康,就像人要運動一樣。 
     
    2. 需要長期插電使用電腦的朋友,建議您按照 3,4 的步驟操作,可少用掉一些充電循環次數以及保護您的電池。 
     
    3. 以下方法是以 Unibody MacBook Pro 15" (2008年版) 進行測試。 
     
    (a)將電池電量充到 95%~99%,當然,能夠控制在 95% 左右是最好的。 
     
    (b)拔掉電源線後,將你的 MacBook(Pro)螢幕蓋上,靜待 Apple 燈滅呈睡眠狀態。 
     
    (c)呈睡眠狀態後,將電源線接上,再讓 MacBook(Pro)睡個幾秒後再打開螢幕。 
     
    (d)這時你會發現,雖然電腦呈開機狀態,但是電源線燈號還是綠燈(不會自動充電)。 
     
    (e)這樣因為沒有啟動自動充電系統,可以讓電量避開 100% 極端值,也不會一直補充電。 
     
    補充:當電量還有 95% ~ 99% 時,充電晶片認為電腦還有充足的電量,所以不會自動開始充電。 
     
    例外:當 MacBook(Pro)使用電池且呈開機狀態時,只要插電後就會啟動充電機制為電池充電。 
     
    4. 以下方法是以 Unibody MacBook Pro 13", 15" (2009年版) 進行測試。 
     
    (a)將電池電量充到 100% 後,拔掉電源線繼續使用電腦。 
     
    (b)等電池電量下降至 96% 以後再將電源線接上。 
     
    (c)這時你會發現,雖然電腦呈開機狀態,但是電源線燈號還是綠燈(不會自動充電)。 
     
    (d)這樣因為沒有啟動自動充電系統,可以讓電量避開 100% 極端值,也不會一直補充電。 
     
    補充:當電量還有 96% ~ 99% 時,充電晶片認為電腦還有充足的電量,所以不會自動開始充電。 
     
    例外:當 MacBook(Pro)使用電池且呈開機狀態,且電量少於 96% 時,插電後就會開始為電池自動充電。 
     
     
     
    MacBook(Pro)電池 FAQ 
     
    Q 1:Apple 說我的電池有 300 或 1000 次的充電循環,所以就只能充這麼多次? 
     
    A 1:如果你有養成良好的充電習慣,讓鋰電子時常有活動的時間,絕對有機會可以超過這個標準次數。 
     
    有興趣可以參考 史上最強!我的小白電池循環次數1000次! 這篇文章。 
     
    Q 2:我的 MacBook(Pro)最少的充電循環次數是多少? 
     
    A 2:根據 WWDC 09' 的數據,2009 年 6 月 8 號之前的 MacBook(Pro)是 300 次,之後的是 1000 次。 
     
    Q 3:我發現我的電池充不到官方說的次數就壞了(或異常),怎麼辦? 
     
    A 3:根據前輩的經驗,如果電池還在保固期內的話,可以拿到 Apple 維修站檢測。 
     
    當經過軟體測試結果是 Bad(不良品)時,就可以免費更換新的電池。 
     
    有興趣可以參考 救命啊 請救救我的電池! (7、10 樓)這篇文章。 
     
    Q 4:如果我的 MacBook(Pro)一直插電使用,電池會不會過充啊? 
     
    A 4 :不會,MacBook(Pro)有充飽斷電機制,不會產生過充的現象,請放心! 
     
    Q 5:如果常常充放電,會不會折損充電次數、加速電池老化、影響電池壽命? 
     
    A 5:不會,常充放電不但不會影響電池壽命反而會讓電池活化增長壽命。 
     
     
     
    Q 6:奇怪,明明顯示「已充電」,但是為何電量還是只有 99%、98% 或 95% 呢? 
     
    A 6:因為當電池充飽後,電量維持在 100% 時,因為電池內充滿鋰電子,活動空間非常的少。 
     
    因此有些鋰電子就會跑出電池外「活動」,這就是上面所說,鋰電子每個月自放(電)率 8% 的原因。 
     
    所以,就算你的電腦整天插著電,就算電池已經充飽,還是有可能往下掉幾 % 喔~ 
     
     
     
     
     
    以下提供幾個充電的 Case 給大家做參考: 
     
    1. 如果要長期(六個月內)不使用筆電者,請將電池充電(放電)到約 50% 以後卸下存放。 
     
      請確定將取出的電池存放於適當溫度下。建議放在防潮箱裡保存較為妥當。 
     
      倘若將電池完全放電後才存放,它就會陷入深度放電狀態,這樣會讓它永遠無法再蓄電。 
     
      反之,若將電池完全充滿電之後存放,電池的蓄電量可能會減少,這表示其續航力會變短。 
     
    2. 在家使用桌電、筆電(接電源),偶爾帶出(約兩個月一次)時才用筆電者。 
     
      每週至少讓電池充放電一次,並定期做電池校正。 
     
    3. 每天將筆電帶出使用(接電源)者,如去學校、辦公室使用。 
     
      每週至少讓電池充放電一次,並定期做電池校正。 
     
    4. 承 Case 3,如果在通勤中會使用筆電、或使電腦處於休眠狀態(有用到電池)者。 
     
      因為時常讓電池有正常的放電行為,大概三個月做一次電池校正即可。 
     
    5. 每天將筆電帶出使用(電池)者,盡量找有電源的地方吧! 
     
      因為時常使用電池會快速用掉許多充電循環數喔~ 
     
    補充:由於鋰電池自放(電)率約為 8% / 月,再加上電池內部電路會耗電,因此建議存放三個月後記得要再拿出檢查。若電量低於 20% 時就可為電池進行充電。注意!如超過四個月以上電池電力有可能處於低電壓的狀態。這時請勿貿然單獨以電池做開機動作,必須先插上電源充電半小時以上再開機!這是為了避免低電壓狀況下開機使用時,瞬間電壓有可能會降低至2.0伏特以下...將會導致鋰電池永久失效不能使用或減短使用壽命。 
     
     
     
    下表是我根據 關于充電電池權威評論 中第 9 點繪製而成: 
     
    (除了 60% 那格是三個月後的數據,其他的都是一年後的數據) 
     

    也就是說,如果電池在電量 40% 的狀態卸下,並在 25 度常溫保存一年後,電量還有 38.4 %

     
    posted @ 2013-05-10 14:07 xiaze 阅读(53) 评论(0) 编辑
     
     

    1. 快速调整 Dock 栏大小

    将鼠标指针放在 Dock 栏图标上的应用图标和回收站图标之间(有点类似于人行道的地方),按住鼠标左键拖动就可以快速调整 Dock 栏大小。
     
     
    2. 使用键盘来控制 Dock 栏
    先按快捷键 Control+fn+F3,然后放开。接下来就可以用键盘上的方向键切换 Dock 栏上的应用程序了。如果你恰好又没鼠标又没触摸板,用这个方法可以救救急。
     
    3. 开启 Dock 栏「运行指示灯」
    在 OS X 10.6 中,Dock 栏上正在运行的应用下面都会有一个白点,这个叫做「运行指示灯」。而在运行 OS X 10.7 Lion 系统的新款 Mac 中这个白点被默认关闭了,导致大家搞不清楚哪些程序正在运行,其实大家可以从「系统偏好设置」——「Dock」中开启「显示一打开的应用程序的指示灯」。
     
     
    4. 在 Safari 中双指翻页
    在 Safari 中,可以使用双指在触摸板上左右滑动翻页(前进/后退)。
     
    5. 输入重音字符
    在英文输入法下,长按元音字母(a,e,i,o,u)就能输入重音字符。
     
     
    6. 屏幕反色
    按快捷键 command+option+control+8 试试?

    7. Spotlight 快捷键
    很多人用 Mac 时间长了之后都会养成从 Spotlight 启动应用程序的习惯,其实如果你用快捷键 control+空格键来启动 Spotlight 的话效率会更高,并且将鼠标指针移动到 Spotlight 搜索项的文件上,还可以预览内容。

    8. 调整鼠标指针大小
    进入「系统偏好设置」——「万能辅助」——「鼠标与触摸板」中,就可以调整鼠标指针大小了。

    9. 快速截屏
    按 command+shift+3 截取全屏图像,按command+shift+4截取指定大小图像或者窗口图像。

    10. 音量微调
    按住 shift+option,再按音量调节键,就可以实现微调。
     
    动作
     
    快捷键停止进程 Command + period
     
    强制退出应用程序 Command + Option + Escape
     
    强制重新启动 Command + Ctrl + 电源 key
     
     
     
    屏幕捕捉动作 保存为
     
    快捷键整个屏幕 PDF 格式在桌面 Command + Shift + 3
     
    部分屏幕 PDF 格式在桌面 Command + Shift + 4
     
    窗口/图标 PDF 格式在桌面 1. Command + Shift + 4
     
    2. 空格整个屏幕 剪贴板 Ctrl + Command + Shift + 3
     
    部分屏幕 剪贴板 Ctrl + Command + Shift + 4
     
    窗口/图标 剪贴板 1. Ctrl + Command + Shift + 4
     
    2. 空格屏幕快照的格式可以自Onyx等系统维护程序中更改为jpeg,png等。
     
    计算机启动动作
     
    快捷键启动到安全模式 Shift (在开机声音后)
     
    打开登录窗口 Shift (当屏幕变成蓝色以后)
     
    并闭打开的窗口 Shift (登录过程中)从光盘启动 c
     
    选择启动磁盘 Option重置 Parameter RAM Command + Option + p + r
     
    启动到 verbose 模式 Command + v启动为单用户模式 Command + s
     
    打开固件 Command + Shift + o + f
     
    火线连接方式 tCom或者command就是指的命令键(苹果键/花键)啦。
     
    Dashboard F12Finder 快捷键动作
     
    快捷键隐藏 Finder Command + h
     
    隐藏其它 Command + Option + h
     
    清空废纸篓 Command + Shift + Delete
     
    清空废纸篓 (不提示) Command + Option + Shift + Delete
     
    获取信息 (静态窗口) Command + i
     
    获取信息 (动态窗口) Command + Option + i
     
    查找 ... Command + f
     
    弹出 Command + e
     
    查看显示选项 Command + j
     
    转到计算机 Command + Shift + c
     
    转到个人主目录 Command + Shift + h
     
    转到 iDisk Command + Shift + i
     
    转到应用程序目录 Command + Shift + a
     
    转到个人收藏 Command + Shift + f
     
    转到目录 ... Command + Shift + g
     
    连接到服务器 ... Command + k
     
    注销... Command + Shift + q
     
    注销 (不提示) Command + Option + Shift + q
     
     
     
    Finder中有关图标的快捷键动作
     
    快捷键选择下一图标 Arrow keys
     
    选择图标名字的首字母 Letter key
     
    选择下一个(字母顺序) Tab
     
    添加图标到选择的项目 Shift + click
     
    选择相邻的图标 (列表显示) Shift + click
     
    选择不相邻的图标 (列表显示) Command + click
     
    编辑图标名字 Return
     
     
     
    文件及目录快捷键动作
     
     
     
    快捷键拷贝项目 Option + 拖拉
     
    原位复制 Command + d
     
    创建替身(拖拉方式) Command + Option + 拖拉
     
    创建替身(命令方式) Command + l (L)
     
    显示原身位置 Command + r
     
    添加到个人收藏 Command + t
     
    对齐项目 Command + 拖拉
     
    在单独的窗口中打开目录 Command + 双击
     
    打开项目 Command + Down Arrow
     
    关闭目录 (转到上层目录) Command + Up Arrow
     
    打开目录 (列表显示) Option + Right Arrow
     
    关闭目录 (列表显示) Option + Left Arrow
     
    打开选择的目录中的所有目录(列表显示)Command + Option + Right Arrow
     
    关闭选择的目录中的所有目录 (列表显示) Command + Option + Left Arrow
     
    删除项目 Command + Delete
     
     
     
    窗口快捷键动作
     
    快捷键新 Finder窗口 Command + n
     
    关闭当前窗口 Command + w
     
    最小化当前窗口 Command + m
     
    关闭所有窗口 Option + click close button
     
    最小化所有窗口 Option + click minimize button
     
    适合屏幕 Option + click zoom button
     
    隐藏应用程序 Option + click (Desktop, Dock item, ...)
     
    移动一个非当前窗口 Command + 拖拉
     
    窗口查看路径 Command + 点击
     
    窗口标题图标显示 Command + 1
     
    列表显示 Command + 2
     
    分栏显示 Command + 3
     
    隐藏/显示栏 Command + bdock
     
     
     
    快捷键动作
     
    快捷键在 Finder 中显示项目 Command + click dock item
     
    切换dock (全键盘操作) Ctrl + d
     
    导航 (全键盘操作) Arrow Left, Arrow Right or Tab, Shift + Tab
     
    打开项目 Space, Return, Enter
     
    隐藏/显示Dock Command + Option + d
     
     
     
    用户进程快捷键动作
     
    动作查看活动的用户程序 Command + Tab
     
    往回查看活动的用户程序 Command + Shift + Tab
     
     
     
    对话框快捷键动作
     
    快捷键选择下一区域 Tab
     
    选择默认按钮 Return or Enter
     
    关闭提示 Esc or Command + period
     
    选择上层或者下层目录(保存/打开) Up Arrow, Down Arrow
     
    向上滚动 (列表) Page up
     
    向下滚动 (列表) Page down
     
     
     
    全键盘操作动作
     
    快捷键打开全键盘操作 Ctrl + F1
     
    提示以及窗口任意控制 Ctrl + F7
     
    高亮下一控制 Tab
     
    高亮下一控制 (文本框) Ctrl + Tab
     
    高亮下一窗口 Command + `
     
    高亮在列表, 标签组或菜单中的项目 Arrow keys
     
    移动滚动条 Arrow keys
     
    高亮文本框相邻的控制 Ctrl + Arrow keys
     
    选择高亮项目 Space bar
     
    选择默认按钮 Return or Enter
     
    点击取消按钮 Esc
     
    不选择项目关闭菜单 Esc反转高亮移动的顺序 Shift + "key"
     
    动作(使用功能键) 快捷键菜单条 Ctrl + F2Dock Ctrl + F3
     
    浏览窗口 Ctrl + F4 (Ctrl + Shift + F4)
     
    工具栏 Ctrl + F5
     
    实用程序窗口 Ctrl + F6
     
    动作 (使用字母键) 快捷键菜单条 Ctrl + mDock Ctrl + d
     
    浏览窗口 Ctrl + w (Ctrl + Shift + w)
     
    工具栏 Ctrl + t
     
    实用程序窗口 Ctrl + u
     
    鼠标键快捷方式 (必须激活 "万能辅助")动作
     
    快捷键使用鼠标进行开关 Option (5次)
     
    (必须激活 "万能辅助")
     
    向上移动8
     
    向下移动 2
     
    向左移动 4
     
    向右移动 6
     
    斜移 1,3,7,9点击 5按下 0
     
     
     
     
     
     
     
    全局
    Cmd-C 复制文件
    Cmd-V 粘贴文件
    Option-拖动 复制文件到新地址
    Cmd-拖动 移动并自动对齐
    Cmd-Delete 删除
    Cmd-Option-拖动 做替身(快捷方式)
    Cmd-Shift-Delete 清空垃圾桶
    Cmd-Shift-Option-Delete 强制清空垃圾桶
    Tab 选定下一个项目
    Shift-Tab 选定上一个项目
    Return 执行默认动作
    Escape 关闭对话框
    Page Up 向上翻页
    向上 箭头 选取上一个文件
    Page Down 向下翻页
    向下 箭头 选取下一个文件
    Cmd-Shift-G 打开’前往文件夹’对话框
    Cmd-句号 [.] 关闭对话框
     
    Exposé 和系统的快捷
    F8 切换Space
    Shift-F8 慢速切换Space
    F9(默认设置) 使用 Exposé 显示所有打开的窗口
    F10(默认设置) 使用 Exposé 在某个应用程序中显示所有打开的窗口
    F11(默认设置) 使用 Exposé 隐藏所有打开的窗口并显示桌面
    Cmd-H 隐藏程序
    Cmd-Option-H 隐藏其他程序
    Cmd-Q 退出程序
    Cmd-Shift-Q 退出所有程序并且注销用户
    Cmd-Option-Shift-Q 强制注销用户
    Cmd-Tab 切换到下一个应用程序
    Cmd-Shift-Tab 切换到上一个应用程序
    Cmd-拖动 整理菜单栏
    按下 Option 键并点按一个窗口 切换窗口并隐藏当前窗口
    按住 Option 并点按 Dock 图标 切换到另一个应用程序并隐藏当前应用程序
    按下 Control 键并点按该项 查看某个项的快捷(上下文)菜单
    将光标移到该词上面,然后按 Cmd-Control-D 使用 Dictionary 查看对字词在应用程序中的定义
     
    停止响应
    Cmd-句号 [.] 停止进程
    Cmd-Option-Escape 打开’强制退出’
    电源键 关机
    Cmd-Option-Shift-电源键 强制关机或重新启动(在某些电脑上)
    Cmd-Control-电源键 强制重启
     
     
    Finder
    Cmd-点击 标题 查看当前窗口的路径
    Cmd-双击 (文件夹上) 新窗口中打开文件夹
    Option-双击 (文件夹上) 新窗口中打开文件夹并关闭当前窗口
    Cmd-1 用图标浏览
    Cmd-2 用列表浏览
    Cmd-Option-向右 箭头 列表模式下显示包含的目录
    向左 箭头 列表模式下关闭选定目录
    Cmd-向下 箭头 在图标或列表模式下打开选定目录
    Cmd-Option-向下 箭头 在图标或列表模式下在新窗口打开选定目录并关闭当前窗口
    Cmd-Shift-Option-向下 箭头 (慢速)在图标或列表模式下在新窗口打开选定目录并关闭当前窗口
    Cmd-向上 箭头 打开上一级目录
    Cmd-Option-向上 箭头 打开上一级目录并关闭当前目录
    Cmd-3 用分栏浏览
    Cmd-4 用cover flow浏览
    Cmd-Y 打开快速查看
    Cmd-Option-Y 用幻灯片显示
    Cmd-Shift-H 打开用户文件夹
    Cmd-Option-Shift-向上 箭头 聚焦桌面
    Cmd-Shift-I 打开iDisk
    Cmd-Shift-D 打开桌面
    Cmd-Shift-C 打开’电脑’
    Cmd-Shift-K 打开网络
    Cmd-Shift-A 打开应用程序
    双击 标题 最小化窗口
    Cmd-M 最小化窗口
    Option-点击 按钮 应用到所有激活的窗口
    按下并按住滚动条 快速浏览长文稿
    按住 Option 键并点按滚动条 迅速在“滚动到当前位置”和“滚动到页面”之间切换
    Cmd-波浪符号 (~) 激活当前应用程序中的上一个或下一个窗口
     
    Dock
    拖动 分割线 自定义Dock大小
    Option-拖动 分割线 调整Dock到合适大小
    Control-点击 显示Dock快捷菜单
    Control-点击图标 显示项目的快捷菜单
    Cmd-点击 打开图标所在文件夹
    Option-点击 切换并隐藏当前程序
    Cmd-Option-点击 切换并隐藏所有程序
    Cmd-Option-拖动 强制程序打开文件
    Cmd-Option-D 显示/隐藏Dock
     
    启动
    *快捷键只能在启动时使用
    当您看到进程指示器(看起来像旋转的齿轮)时,请按住左边的 Shift 键。 防止自动登录
    听到启动音之后立即按住 Shift 键,然后当您看到进程指示器(看起来像旋转的齿轮)时释放该键。 以安全模式启动(只
    有必要的 Mac OS X 项被启动, 一些功能和应用程序可能无法正常工作。)
    在登录屏幕上点按“登录”按钮之后,请按住 Shift 键。 防止登录时打开“登录项”和 Finder 窗口
    C 从光盘启动
    N 从默认的 NetBoot 磁盘映像启动
    T 以目标磁盘模式启动
    Option 选择启动磁盘(在某些电脑上)
    Cmd-X 使用 Mac OS X 而不是 Mac OS 9 来进行启动(如果两者均位于同一宗卷上)
    按住鼠标键 推出可去掉的光盘
    Cmd-Option-P-R 还原参数 RAM
    Cmd-V 显示详细的状态信息(详细模式)
    Cmd-S 以单一用户模式启动
     
     
    Safari
    Cmd-Option-F google搜索栏
    Option-向上 箭头 向上翻页
    Option-向下 箭头 向下翻页
    Cmd-点击 链接 在后台用新标签打开
    Cmd-Shift-点击 链接 打开并激活新标签
    Cmd-Option-点击 链接 打开新窗口
    Option-点击 Close 按钮 关闭其他标签
    Cmd-Shift-] 选取下一个标签
    Cmd-Shift-[ 选取上一个标签
    Cmd-Shift-H 打开主页
    Cmd-Shift-K 切换’禁止弹出窗口'
    Cmd-Option-E 清空缓存
    Cmd-Option-R 不用缓存并刷新页面
    Cmd-F 查找
    Cmd-M 最小化窗口
    Shift-点击 按钮 慢动作动画效果
    Cmd-加号[+] 增大字体
    Cmd-减号[-] 减小字体
    Cmd-0 默认字体
     
    Dashboard
    使用这些快捷来处理 Dashboard 和 Dashboard widget。
    F12(默认设置) 显示或隐藏 Dashboard
    Cmd-R 重新载入当前 widget
    Cmd-等号 (=) 显示或隐藏 widget 栏
    Cmd-向左箭头键,Cmd-向右箭头键 滚动 widget 栏
    注:要更改 Dashboard 的快捷,请选取“文件”>“系统偏好设置”,点按“Exposé & Spaces”,然后点按“Exposé”。
     
     
    Front Row
    您可以使用键盘来控制 Front Row 而无需使用 Apple Remote 遥控器。
    Cmd-Esc (Escape) 打开 Front Row
    Cmd-Esc 或 Esc 从打开的菜单中关闭 Front Row
    向上箭头键,向下箭头键 浏览菜单和列表
    Cmd-Esc 或 Esc 返回上一级菜单
    空格键或 Return 选择菜单或列表中的项
    空格键或 Return 播放和暂停音频或视频
    向上箭头键,向下箭头键 更改音量
    向右箭头键,向左箭头键 前往下一个或上一个歌曲或照片
    向右箭头键,向左箭头键 前往所播放 DVD 的下一章或上一章
    右箭头键,左箭头键(按住按钮) 快进或倒回歌曲、视频或 DVD
    在某些 Apple 键盘和便携式电脑上,您或许也可以使用特定按键来更改音量和控制回放。
     
     
    键盘导航
    Control-F1 打开/关闭全键盘控制
    Control-F2 聚焦菜单栏
    Control-F3 聚焦Dock
    Control-F4 聚焦活跃窗口或下一个窗口
    Control-F5 聚焦窗口工具栏
    Control-F6 聚焦浮动窗口
    Control-F7 在控制或文本框与列表之间移动
    Control-F8 聚焦菜单栏中的状态菜单
    Cmd-Accent [`] 聚焦活跃应用程序的下一个窗口
    Cmd-Shift-Accent [`] 聚焦活跃应用程序的上一个窗口
    Cmd-Option-Accent [`] 聚焦窗口抽屉
    Cmd-Option-T 显示或隐藏字符调板
     
     
     
     
     
    转到(Go To)
    Control-F2 到菜单
    Control-F3 到Dock
    切换(Switch)
    Command-Tab 在程序间切换
    Command-` 在程序中的窗口间切换
    窗口(Window)
    Command-H 隐藏
    Command-M 最小化
    Command-N 新建
    Command-O 打开
    Command-P 打印
    Command-Q 退出
    Command-Q 退出
    Command-W 关闭
    F9 显示所有程序打开的窗口
    F10 显示当前打开的窗口
    F11 隐藏所有窗口并显示桌面
    文件(File)
    Command-S 保存
    Command-Shift-S 另存为
    Command-Shift-N 新建文件夹
    Command-I 简介
    Command-Option-I 显示多个项目的简介
     
     
    移动(Move)
    Home 移动到文件开头
    End 移动到文件结尾
    Command-* 移动到行首
    Command-* 移动到行尾
    Option-* 向左移动一个单词
    Option-* 向右移动一个单词
    选择(Select)
    Shift-Home 选择到文件开头
    Shift-End 选择到文件结尾
    Shift-Command-* 选择到行首
    Shift-Command-* 选择到行尾
    Shift-Option-* 向左选择一个单词
    Shift-Option-* 向右选择一个单词
    编辑(Edit)
    Fn-Backspace 删除光标后的字符
    Finder
    Space Quick Look
    Command-Delete 删除
    Command-Delete-Shift 清空垃圾桶
    Command-Shift-A 转到应用程序目录
    Command-Shift-C 转到COMPUTER目录
    Command-Shift-H 转到HOME目录
    Command-Shift-B 通过蓝牙传送文件
     
    屏幕(Screen)
    Control-Shift-Eject 屏幕休眠
    Command-Shift-3 截取整个屏幕
    Command-Shift-4 截取指定区域
    Command-Option-- 缩小
    Command-Option-= 放大
    Command-Option-Control-8 将屏幕从“白底黑字” 切换成 “黑底白字”
    Command-Option-Ctrl-> 提高对比度
    Command-Option-Ctrl-< 降低对比度
     
    系统(System)
    Command-Option-Escape 强制退出程序
    Command-Option-Eject 睡眠
    Command-Control-Eject 关闭所有程序并重新启动
    Command-Space 切换语言
    Command-esc Front Row
    Command-? 获得帮助
    Command-F5 打开/关闭VoiceOver(朗读菜单、按钮等)
    音量(Volume)
    Shift-volume 调整音量但不发出提示音
    Option-volume 打开“声音”的“系统预置”
    Shift-Option-volume 微调音量(原有的16格调节细化为64格)
     
    其它(Others)
    Command-Shift-Y 用当前选中的文字生成便签
     
    posted @ 2013-05-10 14:06 xiaze 阅读(14) 评论(0) 编辑
     
     

    要使用快捷键或组合键,您可以同时按修饰键和字符键。例如,同时按下 Command 键(标有  符号的按键)和“c”键会将当前选中的任何内容(文本、图形等等)拷贝至夹纸板。这也称作 Command-C 组合键(或快捷键)。


    许多组合键中都包含修饰键。修饰键将改变 Mac OS X 对其他按键或鼠标点按动作的解释方式。修饰键包括 Command、Control、Option、Shift、Caps Lock 和 fn 键(如果您的键盘有 fn 键)。

    以下是出现在 Mac OS X 菜单中的修饰键符号:

    (Command 键) - 在某些 Apple 键盘上,此键也可能带有 Apple 标志()
    (Control 键)
    (Option 键)-“Alt”可能也出现在此键上
    (Shift 键)
    (Caps Lock 键)- 切换 Caps Lock 开或关
    fn(功能键) 

    启动快捷键

    按下按键或组合键,直到所需的功能出现(例如,在启动过程中按住 Option 直到出现“启动管理程序”,或按住 Shift 直到出现“安全启动”)。提示:如果启动功能未起作用,而您使用的是第三方键盘,请连接 Apple 键盘,然后再试一次。

    按键或组合键    功能
    Option    显示所有可引导宗卷(启动管理程序)
    Shift    执行安全启动(以安全模式启动)
    C    从可引导磁盘启动(DVD、CD)
    T    以 FireWire 目标磁盘模式启动
    N    从 NetBoot 服务器启动
    X    强制 Mac OS X 启动(如果存在非 Mac OS X 启动宗卷)
    Command-V    以详细模式启动
    Command-S    以单用户模式启动

    Finder 快捷键

    组合键    功能
    Command-A    选中最前面的 Finder 窗口中的所有项(如果未打开任何窗口则选中桌面内容)
    Option-Command-A    取消选择所有项
    Shift-Command-A    打开“应用程序”文件夹
    Command-C    拷贝所选项/文本至夹纸板
    Shift-Command-C    打开“电脑”窗口
    Command-D    复制所选项
    Shift-Command-D    打开桌面文件夹
    Command-E    推出
    Command-F    查找任何匹配 Spotlight 属性的内容
    Shift-Command-F    查找 Spotlight 文件名匹配项
    Option-Command-F    导航到已打开的 Spotlight 窗口中的搜索栏
    Shift-Command-G    前往文件夹
    Shift-Command-H    打开当前所登录用户帐户的个人文件夹
    Command-I    显示简介
    Option-Command-I    显示检查器
    Control-Command-I    获得摘要信息
    Shift-Command-I    打开 iDisk
    Command-J    调出“显示”选项
    Command-K    连接服务器
    Shift-Command-K    打开“网络”窗口
    Command-L    为所选项制作替身
    Command-M    最小化窗口
    Option-Command-M    最小化所有窗口
    Command-N    新建 Finder 窗口
    Shift-Command-N    新建文件夹
    Option-Command-N    新建智能文件夹
    Command-O    打开所选项
    Shift-Command-Q    注销
    Option-Shift-Command-Q    立即注销
    Command-R    显示(替身的)原身
    Command-T    添加到工具条
    Shift-Command-T    添加到个人收藏
    Option-Command-T    在 Finder 窗口中隐藏工具栏/显示工具栏
    Shift-Command-U    打开“实用工具”文件夹
    Command-V    粘贴
    Command-W    关闭窗口
    Option-Command-W    关闭所有窗口
    Command-X    剪切
    Option-Command-Y    幻灯片显示(Mac OS X 10.5 或更高版本)
    Command-Z    还原/重做
    Command-1    以图标显示
    Command-2    列表方式显示
    Command-3    以分栏方式显示
    Command-4    以 Cover Flow 方式显示(Mac OS X 10.5 或更高版本)
    Command-,(Command 加逗号键)    打开 Finder 偏好设置
    Command-`(重音符键 - 美式英语键盘布局中 Tab 键的上方)    循环显示打开的 Finder 窗口
    Command-Shift-?    打开 Mac 帮助
    Option-Shift-Command-Esc(按住三秒钟)- 仅 Mac OS X v10.5、v10.6 或更高版本    强制退出最前面的应用程序
    Command-[    后退
    Command-]    前进
    Command-上箭头    打开所含文件夹
    Control-Command-上箭头    在新窗口中打开所含文件夹
    Command-下箭头    打开高亮显示的项
    Command-Tab    切换应用程序 - 向前循环
    Shift-Command-Tab    切换应用程序 - 向后循环
    Command-Delete    移到废纸篓
    Shift-Command-Delete    清倒废纸篓
    Option-Shift-Command-Delete    清倒废纸篓(不显示确认对话框)
    空格键(或 Command-Y)    快速查看(Mac OS X 10.5 或更高版本)
    拖移时按 Command 键    将拖移的项移到其他宗卷/位置(按住按键时指针图标发生变化 - 请参阅此文章)
    拖移时按 Option 键    拷贝拖移的项(按住按键时指针图标发生变化 - 请参阅此文章)
    拖移时按 Option-Command 组合键    为拖移的项制作替身(按住按键时指针图标发生变化 - 请参阅此文章)


    应用程序和其他 Mac OS X 键盘命令  

    注:有些应用程序可能不支持以下所有应用程序组合键。

    组合键    功能
    Command-空格键    显示或隐藏 Spotlight 搜索栏(如果安装了多语种,则可能循环显示启用的语系)
    Control-A    移到行/段落的开头
    Control-B    向后移动一个字符
    Control-D    删除光标前的字符
    Control-E    移到行/段落的结尾
    Control-F    向前移动一个字符
    Control-H    删除光标后的字符
    Control-K    删除从光标前的字符到行/段落结尾的所有内容
    Control-L    将光标/所选内容置于可见区域中央
    Control-N    下移一行
    Control-O    在光标后插入一行
    Control-P    上移一行
    Control-T    移调光标前后的字符
    Control-V    下移一个页面
    Option-Command-空格键    显示 Spotlight 搜索结果窗口(如果安装了多语种,则可能循环显示某一语系下的键盘布局和输入法)
    Command-Tab    在打开的应用程序列表中,向下移动到下一个最近使用的应用程序
    Shift-Command-Tab    在打开的应用程序列表中向上移动(按最近使用时间排序)
    Shift-Tab    按反方向浏览各控件
    Control-Tab    聚焦对话框中的下一组控件或聚焦下一个表格(当 Tab 移到下一个单元格时)
    Shift-Control-Tab    聚焦上一组控件
    Command-esc    打开 Front Row(如果已安装)
    Option-推出键    从备选光盘驱动器中推出(如果已安装)
    Control-推出键    显示关机对话框
    Option-Command-推出键    使电脑进入睡眠模式
    Control-Command-推出键    退出所有应用程序(会让您先存储对已打开文稿所作的更改),然后重新启动电脑
    Control Option-Command-推出键    退出所有应用程序(会让您先存储对已打开文稿所作的更改),然后关闭电脑
    fn-Delete    向前删除(适用于便携式 Mac 的内建键盘)
    Control-F1    切换全键盘控制开或关
    Control-F2    聚焦菜单栏
    Control-F3    聚焦 Dock
    Control-F4    聚焦活跃窗口或下一个窗口
    Shift-Control-F4    聚焦上一个活跃窗口
    Control-F5    聚焦工具栏
    Control-F6    聚焦第一个(或下一个)面板
    Shift-Control-F6    聚焦上一个面板
    Control-F7    临时覆盖窗口和对话框中的当前键盘控制模式
    F9    拼贴或取消拼贴所有打开的窗口
    F10    拼贴或取消拼贴当前活跃应用程序中所有打开的窗口
    F11    隐藏或显示所有打开的窗口
    F12    隐藏或显示 Dashboard
    Command-`    激活最前面的应用程序中下一个打开的窗口
    Shift-Command-`    激活最前面的应用程序中上一个打开的窗口
    Option-Command-`    聚焦窗口抽屉
    Command- -(减号)    缩小所选项
    Command-{    使所选内容左对齐
    Command-}    使所选内容右对齐
    Command-|    使所选内容居中对齐
    Command-:    显示“拼写”窗口
    Command-;    查找文稿中拼写错误的词
    Command-,    打开最前面的应用程序的偏好设置窗口(前提是应用程序支持此快捷键)
    Option-Control-Command-,    降低屏幕对比度
    Option-Control-Command-.    增强屏幕对比度
    Command-?    在帮助显示程序中打开应用程序的帮助
    Option-Command-/    打开或关闭字体平滑
    Shift-Command-=    放大所选项
    Shift-Command-3    将屏幕捕捉到文件
    Shift-Control-Command-3    将屏幕捕捉到夹纸板
    Shift-Command-4    将所选内容捕捉到文件
    Shift-Control-Command-4    将所选内容捕捉到夹纸板
    Command-A    高亮显示文稿或窗口中的所有项,或高亮显示文本栏中的所有字符
    Command-B    以粗体显示所选文本或切换文本粗体显示开/关
    Command-C    将所选数据拷贝到夹纸板
    Shift-Command-C    显示“颜色”窗口
    Option-Command-C    拷贝所选文本的样式
    Control-Command-C    拷贝所选项的格式设置并存储到夹纸板
    Option-Command-D    显示或隐藏 Dock
    Command-Control D    在字典应用程序中显示所选词的定义
    Command-E    使用所选内容进行查找
    Command-F    打开“查找”窗口
    Option-Command-F    移到搜索栏控件
    Command-G    查找所选内容出现的下一个位置
    Shift-Command-G    查找所选内容出现的上一个位置
    Command-H    隐藏当前正在运行的应用程序窗口
    Option-Command-H    隐藏所有其他正在运行的应用程序窗口
    Command-I    以斜体显示所选文本或切换文本斜体显示开/关
    Option-Command-I    显示检查器窗口
    Command-J    滚动到所选部分
    Command-M    将活跃窗口最小化至 Dock
    Option-Command-M    将活跃应用程序的所有窗口最小化至 Dock
    Command-N    在最前面的应用程序中创建新文稿
    Command-O    显示对话框,用于选择要在最前面的应用程序中打开的文稿
    Command-P    显示“打印”对话框
    Shift-Command-P    显示用于指定打印参数(页面设置)的对话框
    Command-Q    退出最前面的应用程序
    Command-S    存储活跃文稿
    Shift-Command-S    显示“存储为”对话框
    Command-T    显示“字体”窗口
    Option-Command-T    显示或隐藏工具栏
    Command-U    对所选文本加下划线或打开/关闭加下划线功能
    Command-V    在插入点位置粘贴夹纸板内容
    Option-Command-V    将某对象的样式应用于所选对象(粘贴样式)
    Option-Shift-Command-V    将周围文本的样式应用于所插入对象(粘贴并匹配样式)
    Control-Command-V    将格式设置应用于所选对象(粘贴标尺命令)
    Command-W    关闭最前面的窗口
    Shift-Command-W    关闭文件及其关联窗口
    Option-Command-W    不退出应用程序直接关闭其所有窗口
    Command-X    移去所选内容并存储到夹纸板
    Command-Z    还原上一命令(有些应用程序允许多次还原)
    Shift-Command-Z    重做上一命令(有些应用程序允许多次重做)
    Control-右箭头    聚焦视图(如表格)内的另一个值或单元格
    Control-左箭头    聚焦视图(如表格)内的另一个值或单元格
    Control-下箭头    聚焦视图(如表格)内的另一个值或单元格
    Control-上箭头    聚焦视图(如表格)内的另一个值或单元格
    Command-右箭头    将文本插入点移至当前行的行尾
    Command-左箭头    将文本插入点移至当前行的行首
    Command-下箭头    将文本插入点移至文稿的结尾
    Command-上箭头    将文本插入点移至文稿的开头
    Shift-Command-右箭头

    选中插入点与当前行行尾之间的文本 (*)
    Shift-Command-左箭头    选中插入点与当前行行首之间的文本 (*)
    Shift-右箭头    将文本选择范围向右扩展一个字符 (*)
    Shift-左箭头    将文本选择范围向左扩展一个字符 (*)
    Shift-Command-上箭头    选中插入点与文稿开头之间的文本 (*)
    Shift-Command-下箭头    选中插入点与文稿结尾之间的文本 (*)
    Shift-上箭头    将文本选择范围扩展到上一行相同水平位置的最近字符边缘 (*)
    Shift-下箭头    将文本选择范围扩展到下一行相同水平位置的最近字符边缘 (*)
    Shift-Option-右箭头    将文本选择范围扩展到当前词的词尾,再按一次则扩展到后一词的词尾 (*)
    Shift-Option-左箭头    将文本选择范围扩展到当前词的词首,再按一次则扩展到后一词的词首 (*)
    Shift-Option-下箭头    将文本选择范围扩展到当前段落的段尾,再按一次则扩展到下一段落的结尾 (*)
    Shift-Option-上箭头    将文本选择范围扩展到当前段落的段首,再按一次则扩展到下一段落的段首 (*)
    Control-空格键    在当前输入源和上一输入源之间切换
    Option-Control-空格键    在所有启用的输入源之间切换
    Option-Command-esc    强制退出
    (*) 注:如果未选择任何文本,则从插入点位置开始扩展。如果通过拖移选择文本,则从所选内容的边缘开始扩展。反向选择所选内容会取消选择相应部分。


    万能辅助 - VoiceOver 键盘命令

    有关 Mac OS X v10.6 中 VoiceOver 组合键差异的信息,请参阅此文章。

    组合键    功能
    Command-F5 或
    fn Command-F5    打开或关闭 VoiceOver
    Control Option-F8 或
    fn Control Option-F8    打开 VoiceOver 实用工具
    Control Option-F7 或
    fn Control Option-F7    显示 VoiceOver 菜单
    Control Option-;
    或 fn Control Option-;    启用/停用 VoiceOver 控制选项锁定
    Option-Command-8 或
    fn Command-F11    开启缩放功能
    Option-Command-+    放大
    Option-Command- -(减号)    缩小
    Option-Control-Command-8    反转/复原屏幕颜色
    Control Option-Command-,    降低对比度
    Control Option-Command-.    增强对比度
    注:您可能需要在“键盘”偏好设置中启用“将 F1、F2 等键用作标准功能键”,才能使 VoiceOver 菜单和实用工具正常工作。


    万能辅助 - 鼠标键

    在“万能辅助”偏好设置中打开鼠标键后,您便可以使用键盘或数字小键盘上的键移动鼠标指针。如果电脑没有数字小键盘,请使用 Fn(功能)键。

    组合键    功能
    8    上移
    2    下移
    4    左移
    6    右移
    1    沿对角线向左下角移
    3    沿对角线向右下角移
    7    沿对角线向左上角移
    9    沿对角线向右上角移
    5    按鼠标按钮
    0    按住鼠标按钮
    .(数字小键盘上的句点)    释放按住的鼠标按钮
    另请参阅:鼠标快捷键。

    其他信息

    高级:本文所指为默认的修饰键分配。可在系统偏好设置的“键盘与鼠标”偏好设置中更改修饰键分配。例如,您可以将 Command 键改为用作 Option 键,反之亦然。您也可以恢复默认修饰键设置。

     
    posted @ 2013-05-10 14:05 xiaze 阅读(5) 评论(0) 编辑
     
     

    NSClassFromString是一个很有用的东西,尤其在进行iPhone toolchain的开发上。

    正常来说,

    id myObj = [[NSClassFromString(@"MySpecialClass") alloc] init];

    id myObj = [[MySpecialClass alloc] init];

    是一样的。但是,如果你的程序中并不存在MySpecialClass这个类,下面的写法会出错,而上面的写法只是返回一个空对象而已。

    因此,在某些情况下,可以使用NSClassFromString来进行你不确定的类的初始化。

    比如在iPhone中,NSTask可能就会出现这种情况,所以在你需要使用NSTask时,最好使用:

    [[NSClassFromString(@"NSTask") .....]]

    而不要直接使用[NSTask ...]这种写法。

    NSClassFromString的好处是:

    1 弱化连接,因此并不会把没有的Framework也link到程序中。

    2 不需要使用import,因为类是动态加载的,只要存在就可以加载。因此如果你的toolchain中没有某个类的头文件定义,而你确信这个类是可以用的,那么也可以用这种方法。

     
    id myObj = (NSClassFromString(@"MySpecialClass"));
    能检查是否存在该类
     
    posted @ 2013-05-10 14:04 xiaze 阅读(6) 评论(0) 编辑
     
     

    >> 独立博客收录提交网址

    >> 英文搜索网站收录地址

    >> 网址导航站收录申请登陆口大全

    >> 网站管理员工具大全(搜索引擎):

     
    posted @ 2013-05-10 14:03 xiaze 阅读(5) 评论(0) 编辑
     
     

    一:确认网络环境3G/WIFI 二:使用NSConnection下载数据 三:使用NSXMLParser解析xml文件
    一:确认网络环境3G/WIFI

        1. 添加源
    文件和framework
        开发Web等网络应用程序的时候,需要确认网络环境,连接情况等信息。如果没有处理它们,是不会通过
    Apple的审(我们的)查的。
        Apple 的 例程 Reachability 中介绍了取得/检测网络状态的方法。要在应用程序程序中使用Reachability,首先要完成如下两部:
        1.1. 添加源文件:
        在你的程序中
    使用 Reachability 只须将该例程中的 Reachability.h 和 Reachability.m 拷贝到你的工程中。如下图:
        1.2.添加framework:
        将SystemConfiguration.framework 添加进工程。如下图:
        2. 网络状态
        Reachability.h中定义了三种网络状态:
        typedef enum {
            NotReachable = 0,            //无连接
            ReachableViaWiFi,            //使用3G/GPRS网络
            ReachableViaWWAN            //使用WiFi网络
        } NetworkStatus;
        因此可以这样检查网络状态:
        Reachability *r = [Reachability reachabilityWithHostName:@“
    www.apple.com”];
        switch ([r currentReachabilityStatus]) {
                case NotReachable:
                        // 没有网络连接
                        break;
                case ReachableViaWWAN:
                        // 使用3G网络
                        break;
                case ReachableViaWiFi:
                        // 使用WiFi网络
                        break;
        }
        3.检查当前网络环境
        程序启动时,如果想检测可用的网络环境,可以像这样
        // 是否wifi
        + (BOOL) IsEnableWIFI {
            return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable);
        }
        // 是否3G
        + (BOOL) IsEnable3G {
            return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable);
        }
        例子:
        - (void)viewWillAppear:(BOOL)animated {    
        if (([Reachability reachabilityForInternetConnection].currentReachabilityStatus == NotReachable) && 
                ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus == NotReachable)) {
                self.navigationItem.hidesBackButton = YES;
                [self.navigationItem setLeftBarButtonItem:nil animated:NO];
            }
        }
        4. 链接状态的实时
    通知
        网络连接状态的实时检查,通知在网络应用中也是十分必要的。接续状态发生变化时,需要及时地通知用户:
        Reachability 1.5版本
        // My.AppDelegate.h
        #import "Reachability.h"
        @interface MyAppDelegate : NSObject <UIApplicationDelegate> {
            NetworkStatus remoteHostStatus;
        }
        @property NetworkStatus remoteHostStatus;
        @end
        // My.AppDelegate.m
        #import "MyAppDelegate.h"
        @implementation MyAppDelegate
        @synthesize remoteHostStatus;
        // 更新网络状态
        - (void)updateStatus {
            self.remoteHostStatus = [[Reachability sharedReachability] remoteHostStatus];
        }
        // 通知网络状态
        - (void)reachabilityChanged:(NSNotification *)note {
            [self updateStatus];
            if (self.remoteHostStatus == NotReachable) {
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"AppName", nil)
                             message:NSLocalizedString (@"NotReachable", nil)
                            delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
                [alert show];
                [alert release];
            }
        }
        // 程序启动器,启动网络监视
        - (void)applicationDidFinishLaunching:(UIApplication *)application {
            // 设置网络检测的站点
            [[Reachability sharedReachability] setHostName:@"www.apple.com"];
            [[Reachability sharedReachability] setNetworkStatusNotificationsEnabled:YES];
            // 设置网络状态变化时的通知函数
            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:)
                                                     name:@"kNetworkReachabilityChangedNotification" object:nil];
            [self updateStatus];
        }
        - (void)dealloc {
            // 删除通知对象
            [[NSNotificationCenter defaultCenter] removeObserver:self];
            [window release];
            [super dealloc];
        } 
        
        Reachability 2.0版本
        // MyAppDelegate.h
        @class Reachability;

            @interface MyAppDelegate : NSObject <UIApplicationDelegate> {
                Reachability  *hostReach;
            }

        @end

        // MyAppDelegate.m
        - (void)reachabilityChanged:(NSNotification *)note {
            Reachability* curReach = [note object];
            NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
            NetworkStatus status = [curReach currentReachabilityStatus];
        
            if (status == NotReachable) {
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"AppName""
                                  message:@"NotReachable"
                                  delegate:nil
                                  cancelButtonTitle:@"YES" otherButtonTitles:nil];
                                  [alert show];
                                  [alert release];
            }
        }
                                  
        - (void)applicationDidFinishLaunching:(UIApplication *)application {
            // ...
                      
            // 监测网络情况
            [[NSNotificationCenter defaultCenter] addObserver:self
                                  selector:@selector(reachabilityChanged:)
                                  name: kReachabilityChangedNotification
                                  object: nil];
            hostReach = [[Reachability reachabilityWithHostName:@"www.google.com"] retain];
            hostReach startNotifer];
            // ...
        }
    二:使用NSConnection下载数据
        1.创建NSConnection对象,设置委托对象
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[self urlString]]];
        [NSURLConnection connectionWithRequest:request delegate:self];
        2. NSURLConnection delegate委托方法
            - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;  
            - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;  
            - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;  
            - (void)connectionDidFinishLoading:(NSURLConnection *)connection;  

        3. 实现委托方法
        - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
            [self.receivedData setLength:0]; //通常在这里先清空接受数据的缓存
        }
        - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
            [self.receivedData appendData:data]; //可能多次收到数据,把新的数据添加在现有数据最后
        }
        - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
            // 
    错误处理
        }
        - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
            // disconnect
            [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;   
            NSString *returnString = [[NSString alloc] initWithData:self.receivedData encoding:NSUTF8StringEncoding];
            NSLog(returnString);
            [self urlLoaded:[self urlString] data:self.receivedData];
            firstTimeDownloaded = YES;
        }
    三:使用NSXMLParser解析xml文件
      1. 设置委托对象,开始解析
        NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];   //或者也可以使用initWithContentsOfURL直接下载文件,但是有一个原因不这么做:
        // It's also possible to have NSXMLParser download the data, by passing it a URL, but this is not desirable
        // because it gives less control over the network, particularly in responding to connection errors.
        [parser setDelegate:self];
        [parser parse];

        2. 常用的委托方法
        - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
                                    namespaceURI:(NSString *)namespaceURI
                                    qualifiedName:(NSString *)qName 
                                    attributes:(NSDictionary *)attributeDict;
        - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
                                    namespaceURI:(NSString *)namespaceURI 
                                    qualifiedName:(NSString *)qName;
        - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;
        - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError;

        static NSString *feedURLString = @"http://www.yifeiyang.net/test/test.xml";

        3.  应用举例
        - (void)parseXMLFileAtURL:(NSURL *)URL parseError:(NSError **)error
        {
            NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL];
            [parser setDelegate:self];
            [parser setShouldProcessNamespaces:NO];
            [parser setShouldReportNamespacePrefixes:NO];
            [parser setShouldResolveExternalEntities:NO];
            [parser parse];
            NSError *parseError = [parser parserError];
            if (parseError && error) {
                *error = parseError;
            }
            [parser release];
        }

        - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI 
                                            qualifiedName:(NSString*)qName attributes:(NSDictionary *)attributeDict{
            // 元素开始句柄
            if (qName) {
                elementName = qName;
            }
            if ([elementName isEqualToString:@"user"]) {
                // 输出属性值
                NSLog(@"Name is %@ , Age is %@", [attributeDict objectForKey:@"name"], [attributeDict objectForKey:@"age"]);
            }
        }

        - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI 
                                            qualifiedName:(NSString *)qName
        {
            // 元素终了句柄
            if (qName) {
                   elementName = qName;
            }
        }
        - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
        {
            // 取得元素的
    text
        }
        NSError *parseError = nil;
        [self parseXMLFileAtURL:[NSURL URLWithString:feedURLString] parseError:&parseError];

     

    使用NSOperation和NSOperationQueue启动多线程

    在app store中的很多应用程序非常的笨重,他们有好的界面,但操作性很差,比如说当程序从网上或本地载入数据的时候,界面被冻结了,用户只能等程序完全载入数据之后才能进行操作。
    当打开一个应用程序时,iphone会产生一个包含main方法的线程,所用程序中的界面都是运行在这个线程之中的(table views, tab bars, alerts…),有时候我们会用数据填充这些view,现在问        题是如何有效的载入数据,并且用户还能自如的操作程序。方法是启动新的线程,专门用于数据的下载,而主线程不会因为下载数据被阻塞。
    不管使用任何编程语言,在实现多线程时都是一件很麻烦的事情。更糟糕的是,一旦出错,这种错误通常相当糟糕。然而,幸运的是apple从os x10.5在这方面做了很多的改进,NSThread的引入,使得开发多线程应用程序容易多了。除此之外,它们还引入了两个全新的类,NSOperation和NSOperationQueue。
    接下来我们通过一个实例来剖析如何使用这两个类实现多线程。这里指示展示这两个类的基本用法,当然这不是使用他们的唯一办法。
    如果你熟悉java或者它的别的变种语言的话 ,你会发现NSOperation对象很像java.lang.Runnable接口,就像java.lang.Runnable接口那样,NSOperation类也被设计为可扩展的,而且只有一个需要重写的方法。它就是-(void)main。使用NSOperation的最简单的方式就是把一个NSOperation对象加入到NSOperationQueue队列中,一旦这个对象被加入到队列,队列就开始处理这个对象,直到这个对象的所有操作完成。然后它被队列释放。
    下面的例子中,使用一个获取网页,并对其解析程NSXMLDocument,最后将解析得到的NSXMLDocument返回给主线程。
        
    PageLoadOperation.h@interface PageLoadOperation : NSOperation {
        NSURL *targetURL;}
    @property(retain) NSURL *targetURL;
    - (id)initWithURL:(NSURL*)url;@end

    PageLoadOperation.m
    #import "PageLoadOperation.h"
    #import "AppDelegate.h"
    @implementation PageLoadOperation
    @synthesize targetURL;
    - (id)initWithURL:(NSURL*)url;{
        if (![super init]) return nil;
        [self setTargetURL:url];
        return self;}- (void)dealloc {
        [targetURL release], targetURL = nil;
        [super dealloc];
    }
    - (void)main 
    {
        NSString *webpageString = [[[NSString alloc]
        initWithContentsOfURL:[self targetURL]] autorelease];
        NSError *error = nil;
        NSXMLDocument *document = [[NSXMLDocument alloc]
        initWithXMLString:webpageString 
        options:NSXMLDocumentTidyHTML error:&error];
        if (!document) {
            NSLog(@"%s Error loading document (%@): %@", 
            _cmd, [[self targetURL] absoluteString], error);
             return;
        }
        [[AppDelegate shared]
        performSelectorOnMainThread:@selector(pageLoaded:)
             withObject:document waitUntilDone:YES];
        [document release];
    }
    @end
        正如我们所看到的那样,这个类相当的简单,在它的init方法中接受一个url并保存起来,当main函数被调用的时候,它使用这个保存的url创建一个字符串,并将这个字符串传递给NSXMLDocumentinit方法。如果加载的xml数据没有出错,数据会被传递给AppDelegate,它处于主线程中。到此,这个线程的任务就完成了。在主线程中注销操作队列的时候,会将这个NSOperation对象释放。
    AppDelegate.h
    @interface AppDelegate : NSObject {
        NSOperationQueue *queue;
    }
    + (id)shared;
    - (void)pageLoaded:(NSXMLDocument*)document;
    @end
    AppDelegate.m     
     #import "AppDelegate.h"
    #import "PageLoadOperation.h"
    @implementation AppDelegate
    static AppDelegate *shared;
    static NSArray *urlArray;
    - (id)init
    {
        if (shared)
        {
            [self autorelease];
            return shared;
        }
        if (![super init]) return nil;    NSMutableArray *array = [[NSMutableArray alloc] init];[array addObject:@"http://www.google.com"];[array addObject:@"http://www.apple.com"];[array addObject:@"http://www.yahoo.com"];[array addObject:@"http://www.zarrastudios.com"];[array addObject:@"http://www.macosxhints.com"];urlArray = array;    queue = [[NSOperationQueue alloc] init];shared = self;return self;
        }
           (void)applicationDidFinishLaunching:
        (NSNotification *)aNotification
    {
            for (NSString *urlString in urlArray) 
            {
            NSURL *url = 
            [NSURL URLWithString:urlString];        PageLoadOperation *plo = 
            [[PageLoadOperation alloc] initWithURL:url];
            [queue addOperation:plo];
            [plo release];
            }
    }
    - (void)dealloc
    {
            [queue release], queue = nil;
            [super dealloc];
    }
    + (id)shared;
    {
            if (!shared) {
                [[AppDelegate alloc] init];
            }
            return shared;
    }
    - (void)pageLoaded:(NSXMLDocument*)document;
    {
            NSLog(@"%s Do something with the XMLDocument: %@",
                 _cmd, document);
    }
    @end

    NSOperationQueue的并行控制(NSOperationQueue Concurrency)
            在上面这个简单的例子中,我们很难看出这些操作是并行运行的,然而,如果你你的操作花费的时间远远比这里的要长,你将会发现,队列是同时执行这些操作的。幸运的是,如果你想要为队列限制同时只能运行几个操作,你可以使用NSOperationQueue的setMaxConcurrentOperationCount:方法。例如,[queue setMaxConcurrentOperationCount:2];
     

    Reachability 问题   

     
    // 监测网络情况
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(reachabilityChanged:)
                                                     name: kReachabilityChangedNotification
                                                   object: nil];
            
        //只要有hostReach,他就会调用reachabilityChanged
        hostReach = [[Reachability reachabilityWithHostName: @"www.google.com"] retain];
        [hostReach startNotifier];
        
        //3G网络?
        internetReach = [[Reachability reachabilityForInternetConnection] retain];
        [internetReach startNotifier];
        //wifi网络
        wifiReach = [[Reachability reachabilityForLocalWiFi] retain];
        [wifiReach startNotifier];
    [/appinfo]
    请问,红色的3个地方,具体区别是什么啊?
    使用hostReach的话,程序启动时就会调用hostReach,而wifiReach,internetReach不会
    但是不管用那个,最后调用- (NetworkStatus) currentReachabilityStatus函数,返回指有分了三种情况....
    那这三个函数,到底各自的用途是什么?
    reachabilityWithHostName   eachabilityForInternetConnection eachabilityForLocalWiFi

    在检测 net 的 实时 的连接状态的时候要使用第一个 reachabilityWithHostName method, 它回去连接 host 因为有连接的动作, 而且如果链接过程中网路有 status 的变化,可以通过 notification  反映出来。

    eachabilityForInternetConnection eachabilityForLocalWiFi   这两个更象是一个 getter 方法, 用来检测程序启动的时候 当前 device 可以用的网络是哪个, 
       [[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable  如果是 YES, 那就是Wifi 喽。  这个只是查看你 device 当前可用的网络环境是那个, 更象是一个 device 上 global property 的查询, 不会有实际的连接产生, 所以谈不上 status 的变化。    
         这是我个人的理解,因为apple 的 doc 中这部分的描述很少, 就只有 Reachability 的head file 的comment 可以看看, 所以是我自己的看法拉。 不过也可以 inspect 一下 三个方法 return 的 Reachability 物件对象的结构,发现一些端倪。
     呵呵。
    我测试的结果是,如果链接过程中网路有 status 的变化,那3个函数都可以通过 notification 反映出来,而且它们的返回值都一样的
    因为我只有wifi可以联网,没有3G什么的,所以,要么是NotReachable,要么是ReachableViaWiFi
    表面上看的到的区别就是reachabilityWithHostName最一开始就执行一次,另外2个只有当网络改变时才相应notification
     
    posted @ 2013-05-10 14:02 xiaze 阅读(11) 评论(0) 编辑
     
     

    应用:dedecms有时由于前台会员中心自制模板原因,使得前后台编辑框宽度不一致,这时就要对不同页面进行不同的宽度设置。这里提供的方法主要是使用不同的调取编辑器函数。

     
    1. /include/helpers/util.helper.php中增加以下代码:
     

    if ( ! function_exists('GetEditorD'))

    {
        function GetEditorD($fname, $fvalue, $nheight="350", $etype="Basic", $gtype="print", $isfullpage="FALSE",$bbcode=false)
        {
            if(!function_exists('SpGetEditorD'))
            {
                require_once(DEDEINC."/inc/inc_fun_funAdmin.php");
            }
            return SpGetEditorD($fname, $fvalue, $nheight, $etype, $gtype, $isfullpage, $bbcode);
        }
    }
     
    2. /include/inc/inc_fun_funAdmin.php中增加以下代码:
     

    function SpGetEditorD($fname,$fvalue,$nheight="350",$etype="Basic",$gtype="print",$isfullpage="false",$bbcode=false)

    {
        global $cfg_ckeditor_initialized;
        if(!isset($GLOBALS['cfg_html_editor']))
        {
            $GLOBALS['cfg_html_editor']='fck';
        }
        if($gtype=="")
        {
            $gtype = "print";
        }
        if($GLOBALS['cfg_html_editor']=='fck')
        {
            require_once(DEDEINC.'/FCKeditor/fckeditor.php');
            $fck = new FCKeditor($fname);
            $fck->BasePath        = $GLOBALS['cfg_cmspath'].'/include/FCKeditor/' ;
            $fck->Width        = '100%' ;
            $fck->Height        = $nheight ;
            $fck->ToolbarSet    = $etype ;
            $fck->Config['FullPage'] = $isfullpage;
            if($GLOBALS['cfg_fck_xhtml']=='Y')
            {
                $fck->Config['EnableXHTML'] = 'true';
                $fck->Config['EnableSourceXHTML'] = 'true';
            }
            $fck->Value = $fvalue ;
            if($gtype=="print")
            {
                $fck->Create();
            }
            else
            {
                return $fck->CreateHtml();
            }
        }
        else if($GLOBALS['cfg_html_editor']=='ckeditor')
        {
            require_once(DEDEINC.'/ckeditor/ckeditor.php');
            $CKEditor = new CKEditor();
            $CKEditor->basePath = $GLOBALS['cfg_cmspath'].'/include/ckeditor/' ;
            $config = $events = array();
            $config['extraPlugins'] = 'dedepage,multipic,addon';
              if($bbcode)
              {
                   $CKEditor->initialized = true;
                   $config['extraPlugins'] .= ',bbcode';
                   $config['fontSize_sizes'] = '30/30%;50/50%;100/100%;120/120%;150/150%;200/200%;300/300%';
                   $config['disableObjectResizing'] = 'true';
                   $config['smiley_path'] = $GLOBALS['cfg_cmspath'].'/images/smiley/';
                   // 获取表情信息
                   require_once(DEDEDATA.'/smiley.data.php');
                   $jsscript = array();
                   foreach($GLOBALS['cfg_smileys'] as $key=>$val)
                   {
                        $config['smiley_images'][] = $val[0];
                        $config['smiley_descriptions'][] = $val[3];
                        $jsscript[] = '"'.$val[3].'":"'.$key.'"';
                   }
                   $jsscript = implode(',', $jsscript);
                   echo jsScript('CKEDITOR.config.ubb_smiley = {'.$jsscript.'}');
              }
     
            $GLOBALS['tools'] = empty($toolbar[$etype])? $GLOBALS['tools'] : $toolbar[$etype] ;
            $config['toolbar'] = $GLOBALS['tools'];
            $config['height'] = $nheight;
            $config['skin'] = 'kama';
            $CKEditor->returnOutput = TRUE;
            $code = $CKEditor->editor($fname, $fvalue, $config, $events);
            if($gtype=="print")
            {
                echo $code;
            }
            else
            {
                return $code;
            }
        }else if($GLOBALS['cfg_html_editor']=='ueditor')
    {
            $fvalue = $fvalue=='' ? '<p></p>' : $fvalue;
            $code = '<script type="text/javascript" charset="gbk" src="'.$GLOBALS['cfg_cmspath'].'/include/ueditor/editor_config.js"></script>
            <script type="text/javascript" charset="gbk" src="'.$GLOBALS['cfg_cmspath'].'/include/ueditor/editor_all_min.js"></script>
            <link rel="stylesheet" type="text/css" href="'.$GLOBALS['cfg_cmspath'].'/include/ueditor/themes/default/ueditor.css"/>
            <textarea name="'.$fname.'" id="'.$fname.'" style="100%;">'.$fvalue.'</textarea>
            <script type="text/javascript">
            var ue = new baidu.editor.ui.Editor({ initialFrameWidth:824 });ue.render("'.$fname.'");     //红色处为修改宽度
            </script>';
            if($gtype=="print")
            {
                    echo $code;
            }
            else
            {
                    return $code;
            }
    }
     
        else {
            /*
            // ------------------------------------------------------------------------
            // 当前版本,暂时取消dedehtml编辑器的支持
            // ------------------------------------------------------------------------
            require_once(DEDEINC.'/htmledit/dede_editor.php');
            $ded = new DedeEditor($fname);
            $ded->BasePath        = $GLOBALS['cfg_cmspath'].'/include/htmledit/' ;
            $ded->Width        = '100%' ;
            $ded->Height        = $nheight ;
            $ded->ToolbarSet = strtolower($etype);
            $ded->Value = $fvalue ;
            if($gtype=="print")
            {
                $ded->Create();
            }
            else
            {
                return $ded->CreateHtml();
            }
            */
        }
    }
     
    3. 在编辑器调取页面将以下代码:
    <?php GetEditor("body","",350,"Member"); ?>
    改为:
    <?php GetEditorD("body","",350,"Member"); ?> 
     

     

     
    posted @ 2013-05-10 14:01 xiaze 阅读(384) 评论(0) 编辑
     
     

    设备及环境:AIR 13"、parallels desktop 7虚拟win7(thin)、中兴A356无线上网卡

     
    由于A356没有MAC驱动,所以促使我琢磨如何通过parallels虚拟下启动无线上网卡共享给MAC上网。
     
    话不多说,直接上步骤:
     
    第1步:parallels的偏好设置中的高级,勾选下图的红线部分
    这样MAC的网络设置里会多一个parallels虚拟出来的网卡,后面会提到。
     
    第2步:设置parallels菜单栏的设备里的网络 ,具体按照下图中蓝色部分进行设置
     
    第3步:进入win7里网络设置,勾选无线上网卡的共享选项,如下图:
     
    第4步:同样是WIN7里的网络设置,设置网卡的IP地址,如下图:
     
    第5步:进入MAC下的网络设置,设置第1步中虚拟出的那块网卡的IP地址,如下图:
     

    设置完毕,试试MAC共享虚拟机网络吧。

     
    posted @ 2013-05-10 14:00 xiaze 阅读(18) 评论(0) 编辑
     
     

    注意:虽然本方法可行,但是在opencv2中少了一些library。如果使用缺少的库还需手动添加。使用繁琐。现有更简单的在iOS上运行OpenCV的方法。

    链接地址:http://blog.sina.com.cn/s/blog_698415f20100y7ip.html

    OpenCV的全称是:Open Source Computer Vision Library

    OpenCV1999年由Intel建立,现在由Willow Garage提供支持。OpenCV是一个基于BSD许可证授权(开源)发行的跨平台计算机视觉库,可以运行在LinuxWindowsMac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了PythonRubyMATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。最新版本是2.4.0。(此段文字摘自百度百科

     

    OpenCVIntel公司开发的计算机视觉库,例如,使用这个库,我们可以很容易的检测面部。我纪录了如何在IOS SDK上使用它,包括创建脚本和演示程序。上边是演示程序的截图。

    支持最新的OpenCVIOS SDK

    更新项目, 支持OpenCV 2.2.0, iOS SDK 4.3, Xcode 4 (更新于 04/17/2011.)

    入门

    所有的代码和资料都是开源的,你可以从我的github资源库获得。它包括预编译OpenCV的库和头文件,使您可以轻松地启动测试它。如果你已经有了Git命令,仅仅从我的github克隆资源就可以。如果没有,只好从github下载ziptar包并释放它。

    % git git://github.com/niw/iphone_opencv_test.git
    
    

    获取到源代码,用Xcode打开OpenCVTest.xcodeproj,然后建立它。你会得到一个演示程序在iPhone虚拟机或iPhone设备上。

    从源代码建立OpenCV的资源库

     

    你也可以从源代码OpenCV库使用gcc交叉环境编译。我加了一些支持的脚本使你可以很容易这样做。重要的一点是,像“.framework”的IOS SDK不支持动态链接。我们必须使静态链接库和静态链接配置到你的应用程序中。

    1.  使用CMake命令建立OpenCV. 使用 Homebrew  MacPorts你可以轻松的安装它。

      # 使用Homebrew
      % brew install cmake
      # 使用MacPorts
      % sudo port install cmake
      
      

      如果你已经安装了最新的java更新,你可能会被要求安装javadeveloper_10.6_10m3261.dmg。这很奇怪,但cmake要求从最新的Java更新中删除jni.h,你可以从这里下载 Mac OS X 10.6,这可能需要你订阅苹果开发者(开发者权限)。是的,苹果现在要贬低在MacOS X 上的Java(更新于 10/30/2010)。 

    2. sourceforge获取源代码。我测试了OpenCV-2.2.0.tar.bz2

    3. 在演示项目顶级目录提取下载的归档文件。

      % tar xjvf OpenCV-2.2.0.tar.bz2
      
      
    4.  应用为iOS SDK的补丁。

      % cd OpenCV-2.2.0
      % patch -p1 < ../OpenCV-2.2.0.patch
      
      
    5. 接下来的步骤是建立OpenCV的静态库。所有的文件被装到opencv_simulator目录。运行make命令时,你更好的分配j选项和数量根据你CPU的内核数。没有j选项,它需要较长的时间。

      % cd .. # 返回到演示程序的project目录
      % mkdir build_simulator
      % cd build_simulator
      % ../opencv_cmake.sh Simulator ../OpenCV-2.2.0
      % make -j 4
      % makeinstall
      
      
      译者测试:
      如果你的Mac OS系统版本过高,在运行"opencv_cmake.sh"可能会提示如下信息:
      iOS SDK Version 4.3 is not found, please select iOS version you have.
      
      
      不要紧,这时因为新版本的Mac OS中SDKs的目录结构有所更改,执行以下操作即可解决。
      % vim../opencv_cmake.sh
      
      
      修改:
      DEVELOPER_ROOT="/Developer/Platforms/${TARGET_SDK_NAME}.platform/Developer"
      
      
      为:
      DEVELOPER_ROOT="/Applications/Xcode.app/Contents/Developer/Platforms/${TARGET_SDK_NAME}.platform/Developer"
      
      
      即可。
    6. 之后的下一个步骤,建立设备的OpenCV静态库的所有文件到build_device目录。

      % cd .. # 返回到演示程序的project目录
      % mkdir build_device
      % cd build_device
      % ../opencv_cmake.sh Device ../OpenCV-2.2.0
      % make -j 4
      % make install
      
      

    建立支持脚本

    之后的下一个步骤,建立设备的OpenCV静态库的所有文件到build_device目录

    图像UIImageIplImage之间的转换

    OpenCV是使用IpImage的结构加工,使用IOS SDKUIImage对象显示在屏幕上。这意味着我们需要一个介于UIImageIpImage之间的转换器。值得庆幸的是,我们可以利用iOS SDK APIs做到。

    UIImage创建IpImage是这样的:

    // NOTE 戻り値は利用後cvReleaseImage()で解放してください
    - (IplImage *)CreateIplImageFromUIImage:(UIImage *)image {
      // CGImageをUIImageから取得
      CGImageRef imageRef = image.CGImage;
    
      CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
      // 一時的なIplImageを作成
      IplImage *iplimage = cvCreateImage(
        cvSize(image.size.width,image.size.height), IPL_DEPTH_8U, 4
      );
      // CGContextを一時的なIplImageから作成
      CGContextRef contextRef = CGBitmapContextCreate(
        iplimage->imageData, iplimage->width, iplimage->height,
        iplimage->depth, iplimage->widthStep,
        colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault
      );
      // CGImageをCGContextに描画
      CGContextDrawImage(
        contextRef,
        CGRectMake(0, 0, image.size.width, image.size.height),
        imageRef
      );
      CGContextRelease(contextRef);
      CGColorSpaceRelease(colorSpace);
    
      // 最終的なIplImageを作成
      IplImage *ret = cvCreateImage(cvGetSize(iplimage), IPL_DEPTH_8U, 3);
      cvCvtColor(iplimage, ret, CV_RGBA2BGR);
      cvReleaseImage(&iplimage);
    
      return ret;
    } 
    
    

    不要忘记使用cvReleaseImage释放IpImage!

    IpImage创建UIImage是这样的:

    // NOTE IplImageは事前にRGBモードにしておいてください。
    - (UIImage *)UIImageFromIplImage:(IplImage *)image {
      CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
      // CGImageのためのバッファを確保
      NSData *data =
        [NSData dataWithBytes:image->imageData length:image->imageSize];
      CGDataProviderRef provider =
        CGDataProviderCreateWithCFData((CFDataRef)data);
      // IplImageのデータからCGImageを作成
      CGImageRef imageRef = CGImageCreate(
        image->width, image->height,
        image->depth, image->depth * image->nChannels, image->widthStep,
        colorSpace, kCGImageAlphaNone|kCGBitmapByteOrderDefault,
        provider, NULL, false, kCGRenderingIntentDefault
      );
      // UIImageをCGImageから取得
      UIImage *ret = [UIImage imageWithCGImage:imageRef];
      CGImageRelease(imageRef);
      CGDataProviderRelease(provider);
      CGColorSpaceRelease(colorSpace);
      return ret;
    } 
    
    

    OK,现在你可以在iPhone上享用OpenCV了。

    在自己的项目中使用OpenCV

    • 你可以从我的资源库中下载演示程序,它已经被配置为使用这些库。如果你想在自己的项目中使用OpenCV库,你应该需要增加它的下一个配置。在这个演示程序的Xcode项目中,你可以看到这些设置。

    • OpenCV lib目录为模拟器或设备添加libopencv_core.a。事实上Xcode并不关心是设备或模拟器中的哪一个,因为它是由选定的库去搜索路径。

    • 添加Accelerate.frameworkOpenCV库内部使用。

      Path:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/Accelerate.framework

     
    •  选择你的工程文件(图 1),选中TARGETS下与工程文件同名的target,打开信息面板并选中Build Settings选项卡(图 2)。

      (图 1)
       
      (图 2)
       
      • 添加 -lstdc++  -lz Other Linker Flags(图 2)。
      • OpenCVopen_simulatoropen_device的路径添加到Header Search Paths(图 3-13-23-3)。"$(SRCROOT)/opencv_device/include",参照OpenCVTest项目。
      • 添加OpenCVlib目录到Library Search Paths(图 3-13-23-3)。"$(SRCROOT)/opencv_device/lib",参照OpenCVTest项目。
     
    (图 3-1)
     

    (图 3-2)
     
    (图 3-3)
     
    • 仔细对照你的工程配置是否与演示程序的工程配置相同。如果你的工程配置与演示程序的配置或图3-3相同,那么恭喜你,你的工程环境已经搭建好了。
     
    posted @ 2013-05-10 13:54 xiaze 阅读(38) 评论(0) 编辑
     
     

    OpenCV 是一个开源的跨平台计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法。

    最近试着在MacOS和iOS上使用OpenCV,发现网上关于在MacOS和iOS上搭建OpenCV的资料很少。好不容易搜到些资料,却发现由于OpenCV和XCode的版本更新,变得不再有用了。有些问题费了我很多时间,在此总结分享给大家,希望后来人少走些弯路。

    可以预见到,随着XCode和OpenCV的版本更新,本文可能不再有效了。所以特此注明,文本介绍的搭建方法仅针对于 XCode4.5.1 和 OpenCV 2.4.2版本。

    MacOS系统中使用OpenCV

    安装OpenCV

    相信大部分Mac用户都安装了brew或port,如果你没有装,那么首先安装一下brew吧。使用如下命令安装brew:

    1
    
    
    ruby -e "$(curl -fsSkL raw.github.com/mxcl/homebrew/go)"
    
    

    在安装好brew后,只需要一条命令就可以安装OpenCV了:

    1
    
    
    brew install opencv
    
    

    通常情况下这样做就应该会安装成功,但我在公司和家里面的电脑尝试的时候,brew都会报一些错误,我遇到的都是一些小问题,按照brew的提示信息,解决掉相应的问题即可。

    安装成功后,你应该可以在“/usr/local/include”目录下找到名为opencv和opencv2的目录,这里面是OpenCV相关的头文件。你也可以在“/usr/local/lib”目录下找到许多以libopencv_开头的.dylib文件,这些是OpenCV的链接库文件。

    在MacOS系统中使用OpenCV

    接着我们可以试着在Xcode工程中使用OpenCV。

    新建一个Cocoa Application的工程。工程建好后,选中工程的Target,在Build Settings一样,找到“Header Search Paths”这一个选项,将它的值改为“/usr/local/include”。如下所示:

    接着切换到Build Phases这个tab,在“Link Binary With Libraries”中,选项+号,然后将弹出的文件选择对话框目录切换到“/usr/local/lib”目录下,选择你需要使用的OpenCV链接库(通常情况下,你至少会需要core、highgui和imgproc库),如下图所示:

    这里有一个技巧,因为 /usr 目录在对话框中默认不是可见的,可以按快捷键 command + shift + G,在弹出的“前往文件夹”对话框中输入 /usr/local/lib ,即可跳转到目标文件夹。如下图所示:

    下一步是我自己试出来的,你需要在Build Settings中,将“C++ Language Dialect”设置成C++11,将“C++ Standard Library”设置成libstdc++ ,如下图所示。个人感觉是由于XCode默认设置的GNU++11、libc++与OpenCV库有一些兼容性问题,我在更改该设置前老是出现编译错误。如果后续版本解决了这个问题,就不用进行这一步了。

    把上面的设置都做好后,就可以在需要的使用OpenCV库的地方,加上opencv的头文件引用即可:

    1
    
    
    #import "opencv2/opencv.hpp"
    
    

    注意,如果你的源文件扩展名是.m的,你还需要改成.mm,这样编译器才知道你将会在该文件混合使用C++语言和Objective-C语言。

    OpenCV处理图象需要的格式是cv::Mat类,而MacOS的图象格式默认是NSImage,所以你需要知道如何在cv::Mat与NSImage之前相互转换。如下是一个NSImage的Addition,你肯定会需要它的。该代码来自stackoverflow上的这个贴子

    NSImage+OpenCV.h 文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    
    //
    //  NSImage+OpenCV.h
    //
    //  Created by TangQiao on 12-10-26.
    //
    #import <Foundation/Foundation.h>
    #import "opencv2/opencv.hpp"
    @interface NSImage (OpenCV)
    +(NSImage*)imageWithCVMat:(const cv::Mat&)cvMat;
    -(id)initWithCVMat:(const cv::Mat&)cvMat;
    @property(nonatomic, readonly) cv::Mat CVMat;
    @property(nonatomic, readonly) cv::Mat CVGrayscaleMat;
    @end
    
    

    NSImage+OpenCV.mm文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    
    
    //
    //  NSImage+OpenCV.mm
    //
    //  Created by TangQiao on 12-10-26.
    //
    #import "NSImage+OpenCV.h"
    static void ProviderReleaseDataNOP(void *info, const void *data, size_t size)
    {
        return;
    }
    @implementation NSImage (OpenCV)
    -(CGImageRef)CGImage
    {
        CGContextRef bitmapCtx = CGBitmapContextCreate(NULL/*data - pass NULL to let CG allocate the memory*/,
                                                       [self size].width,
                                                       [self size].height,
                                                       8 /*bitsPerComponent*/,
                                                       0 /*bytesPerRow - CG will calculate it for you if it's allocating the data.  This might get padded out a bit for better alignment*/,
                                                       [[NSColorSpace genericRGBColorSpace] CGColorSpace],
                                                       kCGBitmapByteOrder32Host|kCGImageAlphaPremultipliedFirst);
        [NSGraphicsContext saveGraphicsState];
        [NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithGraphicsPort:bitmapCtx flipped:NO]];
        [self drawInRect:NSMakeRect(0,0, [self size].width, [self size].height) fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0];
        [NSGraphicsContext restoreGraphicsState];
        CGImageRef cgImage = CGBitmapContextCreateImage(bitmapCtx);
        CGContextRelease(bitmapCtx);
        return cgImage;
    }
    -(cv::Mat)CVMat
    {
        CGImageRef imageRef = [self CGImage];
        CGColorSpaceRef colorSpace = CGImageGetColorSpace(imageRef);
        CGFloat cols = self.size.width;
        CGFloat rows = self.size.height;
        cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels
        CGContextRef contextRef = CGBitmapContextCreate(cvMat.data,                 // Pointer to backing data
                                                        cols,                      // Width of bitmap
                                                        rows,                     // Height of bitmap
                                                        8,                          // Bits per component
                                                        cvMat.step[0],              // Bytes per row
                                                        colorSpace,                 // Colorspace
                                                        kCGImageAlphaNoneSkipLast |
                                                        kCGBitmapByteOrderDefault); // Bitmap info flags
        CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), imageRef);
        CGContextRelease(contextRef);
        CGImageRelease(imageRef);
        return cvMat;
    }
    -(cv::Mat)CVGrayscaleMat
    {
        CGImageRef imageRef = [self CGImage];
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
        CGFloat cols = self.size.width;
        CGFloat rows = self.size.height;
        cv::Mat cvMat = cv::Mat(rows, cols, CV_8UC1); // 8 bits per component, 1 channel
        CGContextRef contextRef = CGBitmapContextCreate(cvMat.data,                 // Pointer to backing data
                                                        cols,                      // Width of bitmap
                                                        rows,                     // Height of bitmap
                                                        8,                          // Bits per component
                                                        cvMat.step[0],              // Bytes per row
                                                        colorSpace,                 // Colorspace
                                                        kCGImageAlphaNone |
                                                        kCGBitmapByteOrderDefault); // Bitmap info flags
        CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), imageRef);
        CGContextRelease(contextRef);
        CGColorSpaceRelease(colorSpace);
        CGImageRelease(imageRef);
        return cvMat;
    }
    + (NSImage *)imageWithCVMat:(const cv::Mat&)cvMat
    {
        return [[[NSImage alloc] initWithCVMat:cvMat] autorelease];
    }
    - (id)initWithCVMat:(const cv::Mat&)cvMat
    {
        NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize() * cvMat.total()];
        CGColorSpaceRef colorSpace;
        if (cvMat.elemSize() == 1)
        {
            colorSpace = CGColorSpaceCreateDeviceGray();
        }
        else
        {
            colorSpace = CGColorSpaceCreateDeviceRGB();
        }
        CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)data);
        CGImageRef imageRef = CGImageCreate(cvMat.cols,                                     // Width
                                            cvMat.rows,                                     // Height
                                            8,                                              // Bits per component
                                            8 * cvMat.elemSize(),                           // Bits per pixel
                                            cvMat.step[0],                                  // Bytes per row
                                            colorSpace,                                     // Colorspace
                                            kCGImageAlphaNone | kCGBitmapByteOrderDefault,  // Bitmap info flags
                                            provider,                                       // CGDataProviderRef
                                            NULL,                                           // Decode
                                            false,                                          // Should interpolate
                                            kCGRenderingIntentDefault);                     // Intent
        NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCGImage:imageRef];
        NSImage *image = [[NSImage alloc] init];
        [image addRepresentation:bitmapRep];
        CGImageRelease(imageRef);
        CGDataProviderRelease(provider);
        CGColorSpaceRelease(colorSpace);
        return image;
    }
    @end
    
    

    完成以上步骤后,恭喜你,你可以在源代码中自由地调用OpenCV的函数了。

    在iOS系统中使用OpenCV

    下载或编译opencv2.framework

    接下来介绍如何在iOS程序中使用OpenCV。在iOS上使用最新的OpenCV库比较简单,进入opencv的官网,下载build好的名为opencv2.framework即可(下载地址)。

    如果你比较喜欢折腾,也可以自行下载opencv的源码,在本地编译opencv2.framework。这里有官方网站的教程,步骤非常简单,不过我照着它的教程尝试了一下失败了。感觉还是XCode编译器与OpenCV代码的兼容性问题,所以就没有继续研究了。

    在iOS程序中使用OpenCV

    新建一个iOS工程,将opencv2.framework直接拖动到工程中。然后,你需要在Build Settings中,将“C++ Standard Library”设置成libstdc++。

    因为opencv中的MIN宏和UIKit的MIN宏有冲突。所以需要在.pch文件中,先定义opencv的头文件,否则会有编译错误。将工程的.pch文件内容修改成如下所示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    
    #import <Availability.h>
    #ifdef __cplusplus
        #import <opencv2/opencv.hpp>
    #endif
    #ifdef __OBJC__
        #import <UIKit/UIKit.h>
        #import <Foundation/Foundation.h>
    #endif
    
    

    把上面的设置都做好后,就可以在需要的使用OpenCV库的地方,加上opencv的头文件引用即可:

    1
    
    
    #import "opencv2/opencv.hpp"
    
    

    还是那句话,如果你的源文件扩展名是.m的,你还需要改成.mm,这样编译器才知道你将会在该文件中混合使用C++语言和Objective-C语言。

    同样,iOS程序内部通常用UIImage表示图片,而OpenCV处理图象需要的格式是cv::Mat,你会需要下面这个Addition来在cv::Mat和UIImage格式之间相互转换。该代码来自aptogo的开源代码,他的版权信息在源码头文件中。

    UIImage+OpenCV.h 文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    
    //
    //  UIImage+OpenCV.h
    //  OpenCVClient
    //
    //  Created by Robin Summerhill on 02/09/2011.
    //  Copyright 2011 Aptogo Limited. All rights reserved.
    //
    //  Permission is given to use this source code file without charge in any
    //  project, commercial or otherwise, entirely at your risk, with the condition
    //  that any redistribution (in part or whole) of source code must retain
    //  this copyright and permission notice. Attribution in compiled projects is
    //  appreciated but not required.
    //
    #import <UIKit/UIKit.h>
    @interface UIImage (UIImage_OpenCV)
    +(UIImage *)imageWithCVMat:(const cv::Mat&)cvMat;
    -(id)initWithCVMat:(const cv::Mat&)cvMat;
    @property(nonatomic, readonly) cv::Mat CVMat;
    @property(nonatomic, readonly) cv::Mat CVGrayscaleMat;
    @end
    
    

    UIImage+OpenCV.mm 文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    
    
    //
    //  UIImage+OpenCV.mm
    //  OpenCVClient
    //
    //  Created by Robin Summerhill on 02/09/2011.
    //  Copyright 2011 Aptogo Limited. All rights reserved.
    //
    //  Permission is given to use this source code file without charge in any
    //  project, commercial or otherwise, entirely at your risk, with the condition
    //  that any redistribution (in part or whole) of source code must retain
    //  this copyright and permission notice. Attribution in compiled projects is
    //  appreciated but not required.
    //
    #import "UIImage+OpenCV.h"
    static void ProviderReleaseDataNOP(void *info, const void *data, size_t size)
    {
        // Do not release memory
        return;
    }
    @implementation UIImage (UIImage_OpenCV)
    -(cv::Mat)CVMat
    {
        CGColorSpaceRef colorSpace = CGImageGetColorSpace(self.CGImage);
        CGFloat cols = self.size.width;
        CGFloat rows = self.size.height;
        cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels
        CGContextRef contextRef = CGBitmapContextCreate(cvMat.data,                 // Pointer to backing data
                                                        cols,                      // Width of bitmap
                                                        rows,                     // Height of bitmap
                                                        8,                          // Bits per component
                                                        cvMat.step[0],              // Bytes per row
                                                        colorSpace,                 // Colorspace
                                                        kCGImageAlphaNoneSkipLast |
                                                        kCGBitmapByteOrderDefault); // Bitmap info flags
        CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), self.CGImage);
        CGContextRelease(contextRef);
        return cvMat;
    }
    -(cv::Mat)CVGrayscaleMat
    {
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
        CGFloat cols = self.size.width;
        CGFloat rows = self.size.height;
        cv::Mat cvMat = cv::Mat(rows, cols, CV_8UC1); // 8 bits per component, 1 channel
        CGContextRef contextRef = CGBitmapContextCreate(cvMat.data,                 // Pointer to backing data
                                                        cols,                      // Width of bitmap
                                                        rows,                     // Height of bitmap
                                                        8,                          // Bits per component
                                                        cvMat.step[0],              // Bytes per row
                                                        colorSpace,                 // Colorspace
                                                        kCGImageAlphaNone |
                                                        kCGBitmapByteOrderDefault); // Bitmap info flags
        CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), self.CGImage);
        CGContextRelease(contextRef);
        CGColorSpaceRelease(colorSpace);
        return cvMat;
    }
    + (UIImage *)imageWithCVMat:(const cv::Mat&)cvMat
    {
        return [[[UIImage alloc] initWithCVMat:cvMat] autorelease];
    }
    - (id)initWithCVMat:(const cv::Mat&)cvMat
    {
        NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize() * cvMat.total()];
        CGColorSpaceRef colorSpace;
        if (cvMat.elemSize() == 1)
        {
            colorSpace = CGColorSpaceCreateDeviceGray();
        }
        else
        {
            colorSpace = CGColorSpaceCreateDeviceRGB();
        }
        CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)data);
        CGImageRef imageRef = CGImageCreate(cvMat.cols,                                     // Width
                                            cvMat.rows,                                     // Height
                                            8,                                              // Bits per component
                                            8 * cvMat.elemSize(),                           // Bits per pixel
                                            cvMat.step[0],                                  // Bytes per row
                                            colorSpace,                                     // Colorspace
                                            kCGImageAlphaNone | kCGBitmapByteOrderDefault,  // Bitmap info flags
                                            provider,                                       // CGDataProviderRef
                                            NULL,                                           // Decode
                                            false,                                          // Should interpolate
                                            kCGRenderingIntentDefault);                     // Intent   
        self = [self initWithCGImage:imageRef];
        CGImageRelease(imageRef);
        CGDataProviderRelease(provider);
        CGColorSpaceRelease(colorSpace);
        return self;
    }
    @end
    

    总结

    上面2个环境搭建好后,你就可以在MacOS上试验各种图象处理算法,然后很方便地移值到iOS上。

    一直觉得,图象和声音是移动设备上的特点和优势。因为移动设备没有了可以快速输入的键盘,屏幕也不大,在移动设备上,声音,图象和视频应该是相比文字更方便让人输入的东西。移动端APP应该利用好这些特点,才能设计出更加体贴的功能。

    而且,通常情况下做图象处理都比较好玩,记得以前在学校做了一个在QQ游戏大厅自动下中国象棋的程序,其后台使用了网上下载的一个带命令行接口的象棋AI,然后我的代码主要做的事情就是识别象棋棋盘,然后将棋盘数据传给那个象棋AI,接着获得它返回的策略后,模拟鼠标点击来移动棋子。当时不懂什么图象算法,直接把棋子先截取下来保存,然后识别的时候做完全匹配,非常弱的办法,但是效果非常好,做出来也很好玩。嗯,所以文章最后,我想说的是:have fun!

  • 相关阅读:
    python算法:嵌套数组转变成一维数组
    python算法:约瑟夫问题
    python的加密算法(1):反转加密
    算法:桶排序
    正则表达式学习(3):相关符号解释
    代码这样写更优雅(1)
    正则表达式学习(2)
    神奇的Bank系统之旅哦
    C#之第五单元的项目打印购物单
    C#语言的基础
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3394094.html
Copyright © 2011-2022 走看看