IOS: создайте подменю с помощью UIMenuItemController внутри UIWebView

Я бы хотел, чтобы поведение было таким:

Когда я нажимаю на свой пользовательский UIMenuItem, он показывает другой список UIMenuItems для выбора. Я реализовал таким образом.

@implementation CustomUIWebView{
    BOOL clickedShowSubMenu;
    NSArray *mainMenuItems;
    NSArray *subMenuItems;
}

-(id)initWithCoder:(NSCoder *)aDecoder{
    self = [super initWithCoder:aDecoder];
    if(self){
        UIMenuController *mc = [UIMenuController sharedMenuController];

        UIMenuItem *testSubMenu = [[UIMenuItem alloc] initWithTitle:@"TestSubMenu" action:@selector(testSubMenu:)];
        mainMenuItems = [NSArray arrayWithObjects:testSubMenu, nil];

        UIMenuItem *subItem1 = [[UIMenuItem alloc] initWithTitle:@"Item1" action:@selector(item1:)];
        UIMenuItem *subItem2 = [[UIMenuItem alloc] initWithTitle:@"Item2" action:@selector(item2:)];
        subMenuItems = [NSArray arrayWithObjects:subItem1, subItem2, nil];

        [mc setMenuItems:mainMenuItems];

        [NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onMenuItemDismissed:) name:UIMenuControllerDidHideMenuNotification object:nil];

        clickedShowSubMenu = NO;
    }
    return self;
}

- (void)testSubMenu:(id)sender{
    UIMenuController *mc = [UIMenuController sharedMenuController];
    [mc setMenuItems:subMenuItems];
    mc.menuVisible = YES; //from te doc, it say it would keep the menu not dismiss when this function end
    clickedShowSubMenu = YES;
}

- (void)item1:(id)sender{
}

- (void)item2:(id)sender{
}

- (void)onMenuItemDismissed:(id)sender{
    if(clickedShowSubMenu == YES){
        UIMenuController *mc = [UIMenuController sharedMenuController];
        [mc setMenuItems:mainMenuItems];
        clickedShowSubMenu = NO;
    }
}

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender{
    if(action == @selector(testSubMenu:))return YES;
    else if(action == @selector(item1:))return YES;
    else if(action == @selector(item2:))return YES;
    return NO;
}

@end

Это работает, когда я выбираю длинный текст и нажимаю Test Sub Menu, появляется «подменю»: Item1 и Item2 в той же позиции, что и Test Sub Menu.

Однако проблема возникает во второй раз и позже. Я выбираю другой текст, и Test Sub Menu отображаются правильно, но когда я нажимаю на него, Item1 и Item2 отображаются в СТАРОЙ позиции, в которой они появляются впервые. Их положение никогда не меняется. Я не знаю, что причиной этого.

ИЗМЕНИТЬ Хорошо. Используя Как получить координаты (CGRect) для выделенного текста в UIWebView?, чтобы получить прямую границу выделения и произнести [mc setTargetRect:theRect inView:self]; перед mc.menuVisible = YES;

Это работает, и подменю показывает примерно то же положение, что и главное меню. Это рекомендуется? По-прежнему существует небольшая проблема: когда я выделяю весь абзац, главное меню отображается ПОД абзацем, однако подменю отображается НАД абзацем.


person Yeung    schedule 15.01.2013    source источник
comment
Я использую [mc setTargetRect:theRect inView:self], получая theRect с помощью функции javascript (selectedText внутри UIWebView). В iOS 6.0 это работает. у вас есть какие-либо предложения, чтобы решить эту проблему?   -  person Sandeep    schedule 06.12.2013