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控件,弹出的依旧会是系统默认的菜单项,只是出于程序可读性,可维护性考虑,最好在自定义的 控件中修改菜单性,单独封装起来。

  • 相关阅读:
    Xamarin.Forms 开发IOS、Android、UWP应用
    C# 根据路径删除文件或文件夹
    UWP应用程序使用Prism框架构建MVVM
    创建UWP通用应用程序
    初体验uglifyjs压缩JS
    ecarts图与表格切换时,echarts全变形的原因及解决办法
    vue表格绑定数据中的值发生改变时,表格未刷新
    基于pycaffe的网络训练和结果分析(mnist数据集)
    安装python caffe过程中遇到的一些问题以及对应的解决方案
    logistic regression浅析
  • 原文地址:https://www.cnblogs.com/liaolijun/p/4794819.html
Copyright © 2011-2022 走看看