UIWebView自定義選單欄

weixin_34007291發表於2016-09-18

我的部落格原文地址

主要程式碼

CustomWebView.h

@interface CustomWebView : UIWebView


@end

CustomWebView.m

#import "CustomWebView.h"

@implementation CustomWebView

-(id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        // 全程式碼時入口
        [self addMenu];
    }
    
    return self;
}

-(void)awakeFromNib
{
    [super awakeFromNib];
    
    // xib時入口
    [self addMenu];
}

- (void)addMenu
{
    UIMenuController *menuController = [UIMenuController sharedMenuController];
    
    UIMenuItem *menuItemCopy = [[UIMenuItem alloc] initWithTitle:@"複製" action:@selector(copyT:)];
    
    UIMenuItem *menuItemNote = [[UIMenuItem alloc] initWithTitle:@"筆記" action:@selector(noteT:)];
    
    UIMenuItem *menuItemSearch = [[UIMenuItem alloc] initWithTitle:@"搜尋" action:@selector(searchT:)];
    
    UIMenuItem *menuItemShare = [[UIMenuItem alloc] initWithTitle:@"分享" action:@selector(shareT:)];
    
    NSArray *mArray = [NSArray arrayWithObjects:menuItemCopy,menuItemNote,menuItemSearch,menuItemShare,nil];
    [menuController setMenuItems:mArray];
}

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    if(action == @selector(copyT:) || action == @selector(noteT:) || action == @selector(searchT:) || action == @selector(shareT:))
    {
        return YES;
    }
    
    return NO;
}

-(void)copyT:(id)sender
{
    NSLog(@"複製");
}

-(void)noteT:(id)sender
{
    NSLog(@"筆記");
}

-(void)searchT:(id)sender
{
    NSLog(@"搜尋");
}

-(void)shareT:(id)sender
{
    NSLog(@"分享");
}

@end

程式碼示例

    CustomWebView *webview = [CustomWebView new];
    webview.frame = self.view.bounds;
    [self.view addSubview:webview];
    NSURL *url = [NSURL URLWithString:@"http://www.feheadline.com/webapp/detail.html?id=3374280"];
    NSURLRequest *req = [[NSURLRequest alloc] initWithURL:url];
    [webview loadRequest:req];

剛開始在CustomWebView.m的initWithFrame方法中,但是長按後選單欄一直沒有出來,後來發現,如果是通過xib新增此控制元件的話,通過斷點跟蹤就可發現,它是不會執行initWithFrame方法的,所以那段程式碼應該寫在-(void)awakeFromNib方法中,如果是通過程式碼新增的,就應該寫在initWithFrame方法中,否則不執行新增選單的操作。

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender這個方法可以篩選出需要的選單項,而自定義的WebView中已經重寫了這個方法,所以在webview中彈出的選單是需要的選單項,在其他控制元件中例如TextField控制元件,彈出的依舊會是系統預設的選單項,只是出於程式可讀性,可維護性考慮,最好在自定義的控制元件中修改選單性,單獨封裝起來。

圖片示例:

1979845-c273b4e5a41b47e9.png
uiwebview-menu-1

完整程式碼下載

參考

http://jingyan.baidu.com/article/ac6a9a5e7d3e282b653eac1b.html

相關文章