Я показываю пользовательский UIMenuController
в моем tableview
вот так
но проблема в том, что он отображается в центре, я хочу отобразить его поверх label
, который окрашен в оранжевый цвет. Для отображения поверх label
я сделал это [menu setTargetRect:CGRectMake(10, 10, 0, 0) inView:self.lbl];
ниже весь код.
Но если я показываю UIMenuController
без UITableView
, setTargetRect
работает нормально.
Почему setTargetRect
не работает с UITableView
?
Документ setTargetRect говорит:
(a) Этот целевой прямоугольник (targetRect) обычно является ограничивающим прямоугольником выделения. UIMenuController размещает меню редактирования над этим прямоугольником; если там не хватает места для меню, то размещает его под прямоугольником. Указатель меню помещается в центр верхней или нижней части целевого прямоугольника в зависимости от ситуации.
(b) Обратите внимание, что если вы сделаете ширину или высоту целевого прямоугольника нулевой, UIMenuController обрабатывает целевую область как линию или точку для позиционирования (например, курсор вставки или одиночную точку).
(c) После установки целевой прямоугольник не отслеживает представление; если представление перемещается (например, в представлении прокрутки), вы должны соответствующим образом обновить целевой прямоугольник.
Что мне не хватает?
Мойвиевконтроллер
-(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
}
Моя индивидуальная ячейка
- (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
, что также сделает ненужными методыcanPerformAction
иperformAction
. - person Andrew   schedule 04.07.2015UIMenuController
, что может быть проблемой. Вам возможно потребуется переместить код конфигурацииUIMenuController
в другой метод делегата, такой какtableView:willDisplayCell
, или даже в методUIView
ячейкиdidMoveToSuperview
, чтобы убедиться, что ячейка действительно находится на экране, прежде чем установить ваш пользовательский прямоугольник. - person Andrew   schedule 04.07.2015