【发布时间】:2015-07-02 11:50:51
【问题描述】:
我正在像这样在我的tableview 中显示自定义UIMenuController
但问题是它显示在中心我想将它显示在橙色的label 之上。为了在label 上显示,我做了这个[menu setTargetRect:CGRectMake(10, 10, 0, 0) inView:self.lbl]; 下面是整个代码。
但如果我在没有UITableView 的情况下显示UIMenuController setTargetRect 工作正常。
为什么setTargetRect 不能与UITableView 一起使用?
setTargetRect 文档说:
(a) 这个目标矩形(targetRect)通常是边界矩形 的一个选择。 UIMenuController 将编辑菜单放置在此上方 长方形;如果那里的菜单没有足够的空间,它 将其定位在矩形下方。菜单的指针位于 目标矩形的顶部或底部的中心(视情况而定)。
(b) 请注意,如果您使目标矩形的宽度或高度 零,UIMenuController 将目标区域视为一条线或点 定位(例如,插入符号或单个点)。
(c) 一旦设置,目标矩形不跟踪视图;如果 视图移动(例如在滚动视图中发生),您必须更新 相应的目标矩形。
我错过了什么?
MyViewController
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 5;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
TheCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cid" forIndexPath:indexPath];
cell.lbl.text = [NSString stringWithFormat:@"%ld", (long)indexPath.row];
return cell;
}
- (BOOL)tableView:(UITableView *)tableView shouldShowMenuForRowAtIndexPath:(NSIndexPath *)indexPath {
return YES;
}
-(BOOL)tableView:(UITableView *)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender {
return YES;
}
- (void)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender {
// required
}
MyCustomCell
- (void)awakeFromNib {
// Initialization code
UIMenuItem *testMenuItem = [[UIMenuItem alloc] initWithTitle:@"Test" action:@selector(test:)];
UIMenuController *menu = [UIMenuController sharedMenuController];
[menu setMenuItems: @[testMenuItem]];
[menu setTargetRect:CGRectMake(10, 10, 0, 0) inView:self.lbl];
[menu update];
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
// Configure the view for the selected state
}
-(BOOL) canPerformAction:(SEL)action withSender:(id)sender {
return (action == @selector(copy:) || action == @selector(test:));
}
/// this methods will be called for the cell menu items
-(void) test: (id) sender {
NSLog(@"test");
}
-(void) copy:(id)sender {
UIMenuController *m = sender;
NSLog(@"copy");
}
【问题讨论】:
-
我很确定,因为您正在尝试使用自定义矩形,因此您应该为
shouldShowMenuForRowAtIndexPath返回 NO,这也将使canPerformAction和performAction方法变得不必要。 -
我唯一担心的是在您配置
UIMenuController时标签不会插入到视图层次结构中,这可能是个问题。您可能需要将UIMenuController配置代码移动到不同的委托方法,例如tableView:willDisplayCell,或者甚至可能在单元格的UIView方法didMoveToSuperview中,以确保单元格实际上处于打开状态设置自定义矩形之前的屏幕。 -
@SantaClaus 没有任何效果,我的菜单仍然出现在中心。
标签: ios objective-c uitableview uimenucontroller