Проблемы с отображением 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 является одноэлементным, если вы хотите показать предыдущие элементы меню, снова вы должны установить их.

Другие вопросы по тегам