(iPhone/iPad开发)在UIWebView中自定义菜单栏
2015-09-09 15:20
309 查看
先声明一下,下面用到的方法是本人已经过实际运行达到预期效果后的总结,诸位在参考时可少走一些弯路,放心尝试。
我们所要达到的预期效果是,用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控件,弹出的依旧会是系统默认的菜单项,只是出于程序可读性,可维护性考虑,最好在自定义的 控件中修改菜单性,单独封装起来。
我们所要达到的预期效果是,用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控件,弹出的依旧会是系统默认的菜单项,只是出于程序可读性,可维护性考虑,最好在自定义的 控件中修改菜单性,单独封装起来。
相关文章推荐
- android开发,静音录制视频,在一般清晰度的前提下保证文件大小越小越好
- android之实时音效
- 粒子系统
- iOS缩小图片模糊或出现锯齿的问题
- iOS 声音的录制和播放
- Android手势监测-GestureDector
- Objective-c在宏里拼接字符串
- Android event事件上报方法
- 小胖说事29-----iOS中Navigation中左滑pop页面的三种方法
- Source not found for AeceManager$$FastClassByCGLIB$$15dcd49c.invoke(int, Object, Object[]) line: not available 问题解决
- Android更改状态栏颜色
- android 默认锁屏界面没有紧急呼救入口如何解决
- Android多线程编程(异步通信)--->Handler和AsyncTask
- android 超高仿微信图片选择器
- Android进阶之读取手机联系人显示listview并点击拨号(CursorAdapter)
- android L平台增加来电翻转静音菜单、功能
- iOS图像拉伸解决方案
- 圆形头像设置Android 原代码
- iOS学习笔记26-iOS中Cookie的使用和解析
- Android Handler简单使用