iOS-UIMenuController的使用


第一次使用UIMenuController慕趴,遇見一些問題痪蝇,記錄如下。

概念

UIMenuController即菜單控制器冕房,是一個單例對象躏啰,用來復制,粘貼耙册,刪除等內(nèi)容的操作给僵。

使用步驟

通過下面三部完成UIMenuController的使用,缺一不可

  • 通過[UIMenuController sharedMenuController]來獲取實例對象详拙;
  • 通過 - (void)setTargetRect:(CGRect)targetRect inView:(UIView *)targetView設(shè)置菜單的顯示位置帝际,例如設(shè)置targetRect為下圖的紅色區(qū)域,那么菜單會顯示在targetRect上方中間位置饶辙,如果上方中間位置在屏幕上不能夠顯示蹲诀,那么會顯示在下方中間位置。如果targetRect的寬度高度設(shè)置為零弃揽,那么會在一個點顯示脯爪。(菜單會根據(jù)設(shè)置的區(qū)域自動調(diào)整位置则北,以便能全部顯示出來);
  • 通過menuVisible屬性設(shè)置為YES(或者setMenuVisible:animated:方法)令菜單顯示出來痕慢。

使用菜單

假設(shè)點擊控制器的view顯示菜單尚揣,那么在控制的touchesBegan方法中按照上面說的三步設(shè)置UIMenuController

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    UIMenuController *menu = [UIMenuController sharedMenuController];
    [menu setTargetRect:CGRectMake(100, 300, 200, 20) inView:self.view];
    menu.menuVisible = YES;
}

此時我們運行程序,點擊控制的view并沒有彈出菜單掖举,原因是:

1.控制器或者UIView能夠成為first responder ,需要實現(xiàn)下面方法

- (BOOL)canBecomeFirstResponder
{
    return YES;
}

2.在顯示菜單時需要設(shè)置為first responder 快骗,在touchesBegan中添加[self becomeFirstResponder];

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self becomeFirstResponder]; //設(shè)置為第一響應者 
    UIMenuController *menu = [UIMenuController sharedMenuController];
    [menu setTargetRect:CGRectMake(100, 300, 200, 20) inView:self.view];
    menu.menuVisible = YES;
}

3.并且需要實現(xiàn)UIResponder的canPerformAction:withSender:方法,該方法與編輯菜單相關(guān)塔次,與返回YES的方法關(guān)聯(lián)的菜單將顯示出來滨巴。

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    if (action == @selector(paste:))
    {
        return YES;
    } else if (action == @selector(cut:))
    {
        return YES;
    }
    else{
        return NO;
    }
}

其中paste:cut:方法都定義在UIResponderStandardEditActions協(xié)議,都是與菜單相關(guān)的俺叭。
由于只有paste:cut:方法能夠響應,因此只顯示cut和paste兩個菜單泰偿,顯示效果如下

如果直接返回YES熄守,那么所有菜單都會顯示,如下圖耗跛。

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
     return YES;
}

說明:如果canPerformAction:withSender: 的first responder沒有處理事件裕照,會順著響應鏈向上拋。

使用自定義菜單

可以通過UIMenuItem來自定義菜單调塌,需要設(shè)置菜單的顯示內(nèi)容以及點擊菜單的后的處理方法晋南。然后將自定義的UIMenuItem添加到UIMenuController的menuItems(一個數(shù)組)屬性中。其它使用過程與上面講解的使用菜單的過程一樣羔砾。 具體使用見下面例子负间,

添加自定義菜單

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self becomeFirstResponder]; //成為第一響應者 
    UIMenuController *menu = [UIMenuController sharedMenuController];
    [menu setTargetRect:CGRectMake(100, 300, 200, 20) inView:self.view];
  // 定義兩個菜單a和b
    UIMenuItem *a = [[UIMenuItem alloc] initWithTitle:@"a"
                        action:@selector(aAction)];
    UIMenuItem *b = [[UIMenuItem alloc] initWithTitle:@"b"
                             action:@selector(bAction)];
 // 自定義菜單添加到菜單欄中
    menu.menuItems = @[like,writeBack,report];
    menu.menuVisible = YES;
}

實現(xiàn)aActionbAction方法

- (void)aAction{
    NSLog(@"--aAction--")
}

- (void)bAction{
    NSLog(@"--bAction--")
}

控制器或者UIView能夠成為first responder

- (BOOL)canBecomeFirstResponder
{
    return YES;
}

實現(xiàn)canPerformAction:withSender:方法

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    // 顯示一個系統(tǒng)的paste以及自定義的a,b菜單
    if (action == @selector(paste:) || 
    action == @selector(aAction) ||
    action == @selector(bAction))
    {
        return YES;
    } 
    else{
        return NO;
    }
}

運行程序姜凄,顯效果如下

說明:系統(tǒng)的菜單會顯示在自定義菜單之前政溃。

其它說明

如下圖紅色箭頭所指所示,菜單箭頭指針默認向下态秧,可以通過設(shè)置arrowDirection屬性改變其方向董虱,支持上下左右四個方法。

箭頭指針最下面的點即- (void)setTargetRect:(CGRect)targetRect inView:(UIView *)targetView方法中targetRect說設(shè)置的位置申鱼,具體指向的點見使用步驟說解釋愤诱。

參考資料

apple官方文檔
關(guān)于UIMenuController的用法例子

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市捐友,隨后出現(xiàn)的幾起案子淫半,更是在濱河造成了極大的恐慌,老刑警劉巖匣砖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撮慨,死亡現(xiàn)場離奇詭異竿痰,居然都是意外死亡,警方通過查閱死者的電腦和手機砌溺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門影涉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人规伐,你說我怎么就攤上這事蟹倾。” “怎么了猖闪?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵鲜棠,是天一觀的道長。 經(jīng)常有香客問我培慌,道長豁陆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任吵护,我火速辦了婚禮盒音,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘馅而。我一直安慰自己祥诽,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布瓮恭。 她就那樣靜靜地躺著雄坪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屯蹦。 梳的紋絲不亂的頭發(fā)上维哈,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音登澜,去河邊找鬼笨农。 笑死,一個胖子當著我的面吹牛帖渠,可吹牛的內(nèi)容都是我干的谒亦。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼空郊,長吁一口氣:“原來是場噩夢啊……” “哼份招!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起狞甚,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤锁摔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后哼审,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谐腰,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡孕豹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了十气。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片励背。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖砸西,靈堂內(nèi)的尸體忽然破棺而出叶眉,到底是詐尸還是另有隱情,我是刑警寧澤芹枷,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布衅疙,位于F島的核電站,受9級特大地震影響鸳慈,放射性物質(zhì)發(fā)生泄漏饱溢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一走芋、第九天 我趴在偏房一處隱蔽的房頂上張望绩郎。 院中可真熱鬧,春花似錦绿聘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至彼念,卻和暖如春挪圾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背逐沙。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工哲思, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吩案。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓棚赔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親徘郭。 傳聞我的和親對象是個殘疾皇子靠益,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

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