比如,在UITableViewCell 中,我們要實現(xiàn)長按選擇置頂或者刪除,效果圖如下:
這個時候就要用到 UIMenuController。
UIMenuController
要用UIMenuController 必須實現(xiàn)下面三個方法
//是否可以成為第一響應(yīng)
-(BOOL)canBecomeFirstResponder{
return YES;
}
//是否可以接收某些菜單的某些交互操作
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender{
return YES;
}
//menu所處的view必須成為第一響應(yīng)
[self becomeFirstResponder];
先要實現(xiàn)UIMenuItem的響應(yīng)事件。
UIMenuItem *item1 = [[UIMenuItemalloc]initWithTitle:@"Flag"action:@selector(one:)];
然后要喚醒UIMenuController:
//設(shè)置菜單顯示的位置 frame設(shè)置其文職 inView設(shè)置其所在的視圖(即定位)
[[UIMenuController sharedMenuController] setTargetRect:frame inView:self.view];
//將菜單控件設(shè)置為可見(即展示)
[UIMenuController sharedMenuController].menuVisible = YES;
在UITableViewCell中的使用
1.cell默認是無法成為responder, 所以menu所在的cell 的定義文件(cell.m)重寫-(BOOL)canBecomeFirstResponder;方法。
- (BOOL)canBecomeFirstResponder{
return YES;
}
2.在tableview的cellForRowAtIndexPath 中,cell的初始化之后添加長按手勢
//添加長按手勢
UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(cellLongPress:)];
[priceCell addGestureRecognizer:longPressGesture];
- (void)cellLongPress:(UIGestureRecognizer *)recognizer實現(xiàn)
- #pragma mark - 長按手勢事件
- (void)cellLongPress:(UIGestureRecognizer *)recognizer{
if (recognizer.state == UIGestureRecognizerStateBegan) {
CGPoint location = [recognizer locationInView:self.tableView];
//_longGestureIndexPath是全局變量,用來存放當前手勢所在的cell的indexPath 方便后面的置頂和刪除
_longGestureIndexPath = [self.tableView indexPathForRowAtPoint:location];
PPStockPriceTableViewCell *cell = (PPStockPriceTableViewCell *)recognizer.view;
//這里把cell做為第一響應(yīng)(cell默認是無法成為responder,需要重寫canBecomeFirstResponder方法)
[cell becomeFirstResponder];
UIMenuController *menuController = [UIMenuController sharedMenuController];
//控制箭頭方向
menuController.arrowDirection = UIMenuControllerArrowDefault;
//自定義事件
UIMenuItem *topItem = [[UIMenuItem alloc] initWithTitle:@"置頂" action:@selector(menuTopBtnPressed:)];
UIMenuItem *delItem = [[UIMenuItem alloc] initWithTitle:@"刪除" action:@selector(menuDelBtnPressed:)];
NSArray *menuItemArray = [NSArray arrayWithObjects:topItem, delItem,nil];
[menuController setMenuItems:menuItemArray];
[menuController setTargetRect:cell.frame inView:self.tableView];
[menuController setMenuVisible:YES animated:YES];
}
}
3.實現(xiàn)-(BOOL)canPerformAction:(SEL)action withSender:(id)sender方法。
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
return action==@selector(menuDelBtnPressed:) || action==@selector(menuTopBtnPressed:);
}
然后就是在- (void)menuTopBtnPressed : (id)sender;方法中實現(xiàn)置頂, 在- (void)menuDelBtnPressed: (id)sender; 方法中實現(xiàn)刪除。 由于這里是置頂和刪除,要對數(shù)據(jù)源進行處理,所以前面的全局變量_longGestureIndexPath就可以在這兩個方法中用上了。