Проблемы с отображением UIMenuController одна за другой
Я использую новые возможности настройки UIMenuController для добавления в меню других элементов, кроме "Копировать", для вырезания и вставки в веб-просмотр.
Я получаю ссылку на общий UIMenuController, устанавливаю свой NSArray UIMenuItems в menuItems, и все работает нормально, пока я добавляю один элемент. Например, я вижу [COPY|FOOBAR].
Вместо этого, если я попытаюсь добавить более одного элемента, то получится, что я увижу [КОПИЯ | БОЛЬШЕ], если я нажму на БОЛЬШЕ, чем, наконец, появятся другие элементы.
Можно ли вместо этого показать непосредственно [COPY|FOO|BAR|THREE|FOUR]? Я видел несколько приложений, способных сделать это, в частности iBooks.
Любая помощь очень признательна, спасибо.
Ура, сиссенсио
4 ответа
Ответ FluXa на самом деле правильный, но я не думаю, что это было очень ясно.
Проблема заключается в том, что при добавлении пользовательских объектов UIMenuItem в контроллер общего меню ([UIMenuController sharedMenuController]) только первый пользовательский UIMenuItem будет отображаться на начальном экране меню. Остальные пункты пользовательского меню будут показаны, если пользователь нажмет "Еще...".
Однако, если в меню отсутствуют какие-либо встроенные элементы системного меню (copy:, paste: и т. Д.), На начальном экране меню будут показаны все пользовательские пункты меню, а пункт "More..." отсутствует.
Если вам необходимо включить встроенные системные элементы, просто добавьте пользовательские элементы UIMenuItems с тем же заголовком, но с другим селектором. ( myCopy: vs. copy:)
По сути, это сводится к тому, что НЕ вызывать реализацию по умолчанию canPerformAction: withSender:, явно обрабатывать все пользовательские пункты меню и возвращать NO для всех других (предоставляемых системой) пунктов меню:
- (BOOL) canPerformAction:(SEL)action withSender:(id)sender
{
if ( action == @selector( onCommand1: ) )
{
// logic for showing/hiding command1
BOOL show = ...;
return show;
}
if ( action == @selector( onCommand2: ) )
{
// logic for showing/hiding command2
BOOL show = ...;
return show;
}
if ( action == @selector( onCopy: ) )
{
// always show our custom "copy" command
return YES;
}
return NO;
}
На самом деле у нас возникла та же проблема, когда я пытался разработать приложение для iPad Но то, что я сделал, я отключил элементы всплывающего меню в
- (BOOL)canPerformAction:(SEL) действие с Отправителем:(id) отправитель
С помощью
if ( [UIMenuController sharedMenuController]) { [UIMenuController sharedMenuController].menuVisible = NO; } вернуть NO;
Затем я использовал UIPopoverController.
С уважением, ZaldzBugz
Я столкнулся с той же проблемой, и я переопределил веб-представление с помощью подкласса (да, я знаю, что вы не должны) и вернул NO для canPerformAction: для копии: селектор. Затем я добавил свой собственный элемент Copy в ShareMenuController, который вызывает оригинальный метод из UIWebview. Таким образом можно добавить столько элементов, сколько вы хотите, и они будут изначально видны.
Вы можете получить прямоугольник ранее отображенного UIMenuController, используя menuFrame (свойство только для чтения), используя его, чтобы вычислить позицию для другого UIMenuController, который будет отображаться в том же месте.
В методе действия, в котором вы собираетесь показать второй UIMenuController, получите кадр предыдущего UIMenuController
CGRect previousRect = [[UIMenuController sharedMenuController] menuFrame];
CGRect newRect = CGRectMake(previousRect.origin.x + previousRect.size.width/2, previousRect.origin.y + previousRect.size.height, 0, 0);
Примерно вы получите положение стрелки. Теперь покажи второй UIMenuController
UIMenuItem *testMenuItem1 = [[UIMenuItem alloc] initWithTitle:@"test1" action:@selector(test1ItemClicked)];
UIMenuItem *testMenuItem2 = [[UIMenuItem alloc] initWithTitle:@"test2" action:@selector(test2ItemClicked)];
[[UIMenuController sharedMenuController] setMenuItems:@[testMenuItem1,testMenuItem2]];
UIMenuController *menuController = [UIMenuController sharedMenuController];
[menuController setTargetRect:newRect inView:_readerWebView];
[menuController setMenuVisible:YES animated:YES];
Так как UIMenuController является одноэлементным, если вы хотите показать предыдущие элементы меню, снова вы должны установить их.