有時候我們可能需要複制UILabel上的文本,或者UIImageView的圖檔,而UILabel和UIImageView預設是不響應Touch事件的,也無法複制,那麼我們就需要自己實作一個可複制的UILabel。新添加一個類繼承自UILabel:
為了能接收到事件(能成為第一響應者),我們需要覆寫一個方法:
還需要針對複制的操作覆寫兩個方法:
有了以上三個方法,我們就能處理copy了,當然,在能接收到事件的情況下:
我們已經可以接收到事件了!由于我在上方将tap數設為2,是以需要輕按兩下才能捕獲,接下來,我們需要處理這個tap,以便讓菜單欄彈出來:
這樣一來,一個可複制的UILabel就誕生了!它能處理接收點選、彈出菜單欄、處理copy,這是一個很普通的可複制控件。
-----------------------------------------猥瑣的分界線-----------------------------------------
接下來我們做一個可複制的UIImageView,建立一個新的viewController,放兩個imageView,預設顯示不同的圖:
然後把上面的代碼直接拷過來,改三個地方:
UIPasteboard不僅可以在應用程式内通信,還能在應用程式間通信,你應該已經見到過了,比如我複制一個url,然後打開safari,粘貼到位址欄去,而我們可以在應用程式間“悄悄”的通信、共享資料。
注:這裡的“悄悄”隻是說其他的應用程式不知道,而系統是允許的。
我們用模闆Single View Application來建立兩個簡單的工程,一個叫PasteBoardWrite,另一個叫PasteBoardRead,界面分别如下:
在PasteBoardWrite裡面點“寫入”後把textField中的文本寫入粘貼闆,然後切換到PasteBoardRead的時候顯示出來。如果我們的粘貼闆隻想給“自己人”用的話,就不能用系統的通用粘貼闆,需要我們自己建立一個:
使用這個粘貼闆,我們可以把文本存進去,然後在另一個app裡面讀出來,一些常用的類型已經被設定為屬性了:
除此之外,如果是能夠轉換成plist的資料類型(NSString, NSArray, NSDictionary, NSDate, NSNumber 和 NSURL),我們可以調用setValue:forPasteboardType:方法去存儲資料,其他類型隻能調用setData:forPasteboardType:方法(plist資料類型也可使用),類似于這樣:
擷取就類似于這樣:
用自己建立的粘貼闆,能隻在你的本地應用之間通信,有時候它能讓你的使用者體驗變得更好,比如微信就是這麼做的。
iOS7修改了UIPasteboard的部分設計。
這此之前,你隻要知道任何一個UIPasteboard的Name,就能通路其中的内容,而現在,隻有在同一CFBundleIdentifier辨別下的App才能共享内容,如com.mycompany.a和com.mycompany.b,它們的com.mycompany部分是一樣的,就能共享。