zoukankan      html  css  js  c++  java
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏

    先声明一下,下面用到的方法是本人已经过实际运行达到预期效果后的总结,诸位在参考时可少走一些弯路,放心尝试。

    我们所要达到的预期效果是,用UIWebView加载网页,长按某单词后弹出我们自定义的菜单栏,不显示系统本身自带的,点击某一菜单进行对应的处理。

    首先,先自定义需要的菜单栏

    复制代码
    UIMenuController *menuController = [UIMenuController sharedMenuController];
        UIMenuItem *menuItemCiYi = [[UIMenuItem alloc] initWithTitle:@"看词义" action:@selector(ciYi:)];
        UIMenuItem *menuItemSound = [[UIMenuItem alloc] initWithTitle:@"听发音" action:@selector(listeningSound:)];
        UIMenuItem *menuItemShengCi = [[UIMenuItem alloc] initWithTitle:@"加入生词本" action:@selector(addWord:)];
        NSArray *mArray = [NSArray arrayWithObjects:menuItemCiYi,menuItemSound,menuItemShengCi, nil];
        [menuItemCiYi release];
        [menuItemSound release];
        [menuItemShengCi release];
        [menuController setMenuItems:mArray];
    复制代码
    可以看出,每个菜单对应的操作方法名,至于这段代码写在什么位置,稍后再说,这也是需要额外注意的地方。 

    自定义一个继承UIWebView的控件CustomWebView,手动处理某一菜单对应的操作

    在CustomWebView.m中

    复制代码
    //
    //  CustomWebView.m
    //  LrcWebViewTest
    //
    //  Created by Andy on 12-6-20.
    //  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
    //

    #import "CustomWebView.h"

    @implementation CustomWebView

    - (id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            // Initialization code
            
        }
        return self;
    }
    -(void)awakeFromNib{

    }
    -(BOOL)canPerformAction:(SEL)action withSender:(id)sender{
        if(action == @selector(ciYi:) || action == @selector(listeningSound:) ||action == @selector(addWord:)){
            return YES;
        }
        return NO;
    }

    -(IBAction)ciYi:(id)sender;{
        NSLog(@"ciYi");
    }

    -(IBAction)listeningSound:(id)sender{
        NSLog(@"listeningSound");
    }

    -(IBAction)addWord:(id)sender{
        NSLog(@"addWord");
    }


    /*
    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    - (void)drawRect:(CGRect)rect
    {
        // Drawing code
    }
    */

    @end
    复制代码
    通过重写-(BOOL)canPerformAction:(SEL)action withSender:(id)sender函数,告知菜单栏哪些菜单可以显示。

    然后就是讨论这个自定义的菜单栏,应该写在什么位置。

    之前是写在CustomWebView.m的initWithFrame方法中,但是长按后菜单栏一直没有出来,后来发现,如果是通过xib添加此控件的话,通过断点跟踪就可发现,它是不会执行initWithFrame方法的,所以那段代码应该写在-(void)awakeFromNib方法中,如果是通过代码添加的,就应该写在initWithFrame方法中,否则不执行添加菜单的操作。

    还有一点是,刚刚在尝试过程中发现,如果将添加菜单栏的代码写在添加UIWebView控件界面的ViewDidLoad中也可以达到对应的效果,也许你会问,这样做的话是改变了那个界面的菜单栏,会不会那个界面中弹出的菜单栏都是同一个样子?答案是不会的,因为通过重写

    -(BOOL)canPerformAction:(SEL)action withSender:(id)sender这个方法可以筛选出需要的菜单项,而自定义的WebView中已经重写了这个方法,所以在webview中弹 出的菜单是需要的菜单项,在其他控件中例如TextField控件,弹出的依旧会是系统默认的菜单项,只是出于程序可读性,可维护性考虑,最好在自定义的 控件中修改菜单性,单独封装起来。

  • 相关阅读:
    CodeForces 785D Anton and School
    CodeForces 785C Anton and Fairy Tale
    CodeForces 785B Anton and Classes
    CodeForces 785A Anton and Polyhedrons
    爱奇艺全国高校算法大赛初赛C
    爱奇艺全国高校算法大赛初赛B
    爱奇艺全国高校算法大赛初赛A
    EOJ 3265 七巧板
    EOJ 3256 拼音魔法
    EOJ 3262 黑心啤酒厂
  • 原文地址:https://www.cnblogs.com/liaolijun/p/4794819.html
Copyright © 2011-2022 走看看