Проблемы с отображением UIMenuController одна за другой - PullRequest
10 голосов
/ 15 июля 2010

Я использую новые возможности настройки UIMenuController для добавления других элементов, кроме «Копировать», в меню для вырезания и вставки в веб-просмотр.

Что я делаю, так это получение ссылки на общий UIMenuController, настройкамой NSArray UIMenuItems в menuItems, и все работает нормально, пока я добавляю один элемент.Например, я вижу [COPY | FOOBAR].

Вместо этого, если я пытаюсь добавить более одного элемента, то получается, что я вижу [COPY | MORE], если я нажимаю в MORE, то, наконец, другие элементы будутпоказать вверх.

Можно ли вместо этого показать непосредственно [COPY | FOO | BAR | THREE | FOUR]?Я видел несколько приложений, которые могут это сделать, в частности iBooks.

Любая помощь очень важна, спасибо.

Приветствия, sissensio

Ответы [ 4 ]

15 голосов
/ 05 января 2011

ответ 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;
}
4 голосов
/ 21 июля 2010

у нас такая же проблема, когда я пытался разработать приложение для iPad. Но я отключил элементы всплывающего меню в

  • (BOOL) canPerformAction: (SEL) действие с Отправителем: (id) отправитель

Использование

if ([UIMenuController sharedMenuController]) { [UIMenuController sharedMenuController] .menuVisible = НЕТ; } вернуть NO;

Затем я использовал UIPopoverController.

С уважением, ZaldzBugz

2 голосов
/ 22 августа 2010

Столкнулся с той же проблемой, и я переопределил веб-представление с помощью подкласса (да, я знаю, что вы не должны) и вернул NO для canPerformAction: для экземпляра copy:.Затем я добавил свой собственный элемент Copy в ShareMenuController, который вызывает оригинальный метод из UIWebview.Таким образом можно добавить столько элементов, сколько вы хотите, и они изначально видны.

0 голосов
/ 30 января 2014

Вы можете получить прямоугольник ранее отображенного UIMenuController, используя menuFrame (свойство только для чтения), используя его, чтобы вычислить позицию для другого UIMenuController, который будет отображаться в том же месте.

В методе действия, в котором вы собираетесь показать второй UIMenuController, получите кадр предыдущего UIMenuController

enter image description here

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];

enter image description here

, поскольку UIMenuController является одноэлементным, если вы хотите показать предыдущие элементы меню, вам снова нужно их установить.

...