iOS文本編程指南(八)

展示并操作編輯菜單

編輯菜單是一個(gè)上下文菜單泌辫,它展示并提供了一些命令璃诀,這些命令能夠操作選中內(nèi)容香府,例如一個(gè)文本頁(yè)面中的文字或者圖片。編輯菜單是復(fù)制峰锁,剪切,粘貼操作的一個(gè)組成部分双戳。它默認(rèn)展示復(fù)制,剪切糜芳,粘貼飒货,選中以及全選的命令。然后峭竣,你可以添加一個(gè)自定義的條目到編輯菜單來(lái)對(duì)選中內(nèi)容進(jìn)行其他操作塘辅。

管理選中和編輯菜單

為了在一個(gè)頁(yè)面中復(fù)制或剪切一些東西,這些東西必須是被選中的皆撩】鄱眨可以是一串文本,一張圖片扛吞,一個(gè)URL呻惕,一個(gè)顏色,或者是其他種類的數(shù)據(jù)滥比,包括自定義對(duì)象亚脆。你必須自己管理頁(yè)面中選中的對(duì)象。如果用戶通過使用某種手勢(shì)選擇了頁(yè)面中的對(duì)象盲泛,你必須要處理這個(gè)事件濒持,記錄選中區(qū)域(取消選中之前已選中內(nèi)容),并在頁(yè)面上標(biāo)記出選中的內(nèi)容寺滚「逃可以允許用戶選中多個(gè)對(duì)象,執(zhí)行復(fù)制村视,剪切官套,粘貼操作,你必須自己實(shí)現(xiàn)這種多選行為。

注:對(duì)于處理觸摸事件虏杰,包括手勢(shì)的內(nèi)容讥蟆,查看Event Handling Guide for iOS

當(dāng)你的應(yīng)用識(shí)別出用戶已經(jīng)請(qǐng)求了編輯菜單——也就是產(chǎn)生了一次選中行為——你應(yīng)該完成以下幾步來(lái)展示菜單:

  1. 調(diào)用UIMenuController的sharedMenuController類方法獲取全局的實(shí)例。
  2. 計(jì)算選中區(qū)域的邊界纺阔,并將結(jié)果傳給setTargetRect:inView:方法瘸彤。編輯菜單將在這個(gè)區(qū)域的上面或者下面出現(xiàn)(取決于選中區(qū)域距離屏幕頂部及底部的距離)。
  3. 調(diào)用setMenuVisible:animated方法讓編輯菜單顯示出來(lái)笛钝。

下面代碼展示了你應(yīng)該如何在touchesEnded:withEvent:方法中展示編輯菜單质况,用以處理復(fù)制,剪切玻靡,粘貼操作结榄。(注意,示例代碼省略了處理選中的代碼囤捻。)代碼也展示了自定義頁(yè)面發(fā)送becameFirstResponder消息來(lái)確保成為接下來(lái)復(fù)制臼朗,剪切,粘貼操作的第一響應(yīng)者蝎土。

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *theTouch = [touches anyObject];

    if ([theTouch tapCount] == 2  && [self becomeFirstResponder]) {

        // selection management code goes here...

        // bring up edit menu.
        UIMenuController *theMenu = [UIMenuController sharedMenuController];
        CGRect selectionRect = CGRectMake (currentSelection.x, currentSelection.y, SIDE, SIDE);
        [theMenu setTargetRect:selectionRect inView:self];
        [theMenu setMenuVisible:YES animated:YES];

    }
}

菜單初始包括所有第一響應(yīng)者實(shí)現(xiàn)了UIResponderStandardEditActions方法的行為(copy: paste:等)视哑。在菜單出現(xiàn)之前,系統(tǒng)發(fā)送canPerformAction:withSender:消息到第一響應(yīng)者誊涯。在該方法的實(shí)現(xiàn)中挡毅,響應(yīng)者評(píng)估該命令(第一個(gè)參數(shù)selector中傳遞)是否適用于當(dāng)前場(chǎng)合。例如暴构,如果selector是paste:并且剪切板中沒有該頁(yè)面能夠處理的數(shù)據(jù)跪呈,響應(yīng)者應(yīng)當(dāng)返回NO,來(lái)取消粘貼命令的展示取逾。如果第一響應(yīng)者沒有實(shí)現(xiàn)canPerformAction:withSender:方法耗绿,或者沒有處理指定命令,消息將沿響應(yīng)鏈傳遞下去菌赖。

下面代碼展示了canPerform:withSender方法的實(shí)現(xiàn)缭乘,查找并匹配了cut:,copy:以及paste:方法×鹩茫基于當(dāng)前的選中文本以及剪切板內(nèi)容堕绩,會(huì)開啟或關(guān)閉復(fù)制,剪切邑时,粘貼等菜單命令奴紧。

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    BOOL retValue = NO;
    ColorTile *theTile = [self colorTileForOrigin:currentSelection];

    if (action == @selector(paste:) )
        retValue = (theTile == nil) &&
         [[UIPasteboard generalPasteboard] containsPasteboardTypes:
         [NSArray arrayWithObject:ColorTileUTI]];
    else if ( action == @selector(cut:) || action == @selector(copy:) )
        retValue = (theTile != nil);
    else
        retValue = [super canPerformAction:action withSender:sender];
    return retValue;
}

注意代碼里最后的else里調(diào)用了父類的實(shí)現(xiàn),父類就有機(jī)會(huì)處理子類選擇忽略的命令晶丘。

注意菜單命令在執(zhí)行后黍氮,可能會(huì)改變其他菜單命令唐含。例如,當(dāng)用戶執(zhí)行了全選操作沫浆,復(fù)制和剪切操作應(yīng)當(dāng)出現(xiàn)在菜單中捷枯。在這種情況下,響應(yīng)者可以在菜單始終可見的情況下通過調(diào)用menu controller的update方法更新菜單专执,這就導(dǎo)致了canPerformAcation:withSender:的調(diào)用淮捆。

添加自定義條目至編輯菜單

你可以添加自定義條目到編輯菜單。當(dāng)用戶點(diǎn)擊此項(xiàng)時(shí)本股,將發(fā)出一個(gè)命令攀痊,該命令將以特定應(yīng)用程序的方式影響當(dāng)前目標(biāo)。UIKit通過target-action機(jī)制完成該目的拄显。該條目的點(diǎn)擊導(dǎo)致了一個(gè)行為消息被發(fā)送到響應(yīng)鏈中第一個(gè)能處理該消息的對(duì)象苟径。下圖展現(xiàn)了一個(gè)自定義條目的例子

UIMenuItem的實(shí)例代表自定義條目。UIMenuItem對(duì)象有兩個(gè)屬性躬审,title和action selector棘街,都可以任意時(shí)刻修改。要實(shí)現(xiàn)一個(gè)自定義菜單條目承边,你必須初始化這個(gè)UIMenuItem實(shí)例的這些屬性蹬碧,將該實(shí)例添加到menu controller的自定義菜單條目數(shù)組中,并在合適的響應(yīng)者類中實(shí)現(xiàn)該命令的操作炒刁。

其他方面是各處通用的:使用UIMenuController的單例對(duì)象。在自定義或者重寫的頁(yè)面中誊稚,你設(shè)置了頁(yè)面為第一響應(yīng)者翔始,獲取menu controller單例,設(shè)置一個(gè)目標(biāo)rectangle里伯,通過調(diào)用setMenuVisible:animated:方法展示編輯菜單城瞎。下面代碼是一個(gè)添加自定義菜單項(xiàng)的簡(jiǎn)單例子。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *theTouch = [touches anyObject];
    if ([theTouch tapCount] == 2) {
    [self becomeFirstResponder];
    UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:@"Change Color" action:@selector(changeColor:)];
    UIMenuController *menuCont = [UIMenuController sharedMenuController];
        [menuCont setTargetRect:self.frame inView:self.superview];
        menuCont.arrowDirection = UIMenuControllerArrowLeft;
        menuCont.menuItems = [NSArray arrayWithObject:menuItem];
        [menuCont setMenuVisible:YES animated:YES];
    }
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {}

- (BOOL)canBecomeFirstResponder { return YES; }

- (void)changeColor:(id)sender {
    if ([self.viewColor isEqual:[UIColor blackColor]]) {
        self.viewColor = [UIColor redColor];
    } else {
        self.viewColor = [UIColor blackColor];
    }
    [self setNeedsDisplay];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末疾瓮,一起剝皮案震驚了整個(gè)濱河市脖镀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌狼电,老刑警劉巖蜒灰,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異肩碟,居然都是意外死亡强窖,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門削祈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)翅溺,“玉大人脑漫,你說(shuō)我怎么就攤上這事×椋” “怎么了优幸?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)褪猛。 經(jīng)常有香客問我网杆,道長(zhǎng),這世上最難降的妖魔是什么握爷? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任跛璧,我火速辦了婚禮,結(jié)果婚禮上新啼,老公的妹妹穿的比我還像新娘追城。我一直安慰自己,他們只是感情好燥撞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布座柱。 她就那樣靜靜地躺著,像睡著了一般物舒。 火紅的嫁衣襯著肌膚如雪色洞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天冠胯,我揣著相機(jī)與錄音火诸,去河邊找鬼。 笑死荠察,一個(gè)胖子當(dāng)著我的面吹牛置蜀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悉盆,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼盯荤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了焕盟?” 一聲冷哼從身側(cè)響起秋秤,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎脚翘,沒想到半個(gè)月后灼卢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡堰怨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年芥玉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片备图。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡灿巧,死狀恐怖赶袄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抠藕,我是刑警寧澤饿肺,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站盾似,受9級(jí)特大地震影響敬辣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜零院,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一溉跃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧告抄,春花似錦撰茎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至募疮,卻和暖如春炫惩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背阿浓。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工他嚷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人芭毙。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓爸舒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親稿蹲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 復(fù)制鹊奖,剪切苛聘,粘貼操作 用戶可以復(fù)制某個(gè)應(yīng)用中的文本,圖片忠聚,或者其他數(shù)據(jù)到另外一個(gè)地方设哗,到該應(yīng)用內(nèi)或者另一個(gè)應(yīng)用都可...
    卓小土閱讀 392評(píng)論 0 2
  • 編輯菜單是一種上下文菜單,它用來(lái)顯示可執(zhí)行的命令两蟀,例如文本視圖或圖片中的文字网梢。編輯菜單是復(fù)制、剪切赂毯、以及粘貼操作的...
    raingu24閱讀 802評(píng)論 0 0
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,116評(píng)論 25 707
  • 家有小小男子漢,如何培養(yǎng)他們變得優(yōu)秀而堅(jiān)韌烦感?本文13個(gè)關(guān)鍵要點(diǎn)巡社,針對(duì)男孩培養(yǎng)完全受用! 關(guān)鍵一:為什么男孩一定要“...
    第6通道閱讀 118評(píng)論 0 0
  • 01. 母親買來(lái)一件粉色的棉麻衣衫,問父親和弟弟好不好看绿渣,弟弟瞅了一眼朝群,手指繼續(xù)忙著操作技能,說(shuō)了這么一句中符,給我姐...
    未央未你閱讀 357評(píng)論 0 2