你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> (iPhone/iPad開發)在UIWebView中自定義菜單欄

(iPhone/iPad開發)在UIWebView中自定義菜單欄

編輯:IOS開發綜合

先聲明一下,下面用到的方法是本人已經過實際運行達到預期效果後的總結,諸位在參考時可少走一些彎路,放心嘗試。

我們所要達到的預期效果是,用UIWebView加載網頁,長按某單詞後彈出我們自定義的菜單欄,不顯示系統本身自帶的,點擊某一菜單進行對應的處理。

首先,先自定義需要的菜單欄
[cpp] 
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中
[cpp]
// 
//  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函數,告知菜單欄哪些菜單可以顯示。

然後就是討論這個自定義的菜單欄,應該寫在什麼位置。www.2cto.com
之前是寫在CustomWebView.m的initWithFrame方法中,但是長按後菜單欄一直沒有出來,後來發現,如果是通過xib添加此控件的話,通過斷點跟蹤就可發現,它是不會執行initWithFrame方法的,所以那段代碼應該寫在-(void)awakeFromNib方法中,如果是通過代碼添加的,就應該寫在initWithFrame方法中,否則不執行添加菜單的操作。

還有一點是,剛剛在嘗試過程中發現,如果將添加菜單欄的代碼寫在添加UIWebView控件界面的ViewDidLoad中也可以達到對應的效果,也許你會問,這樣做的話是改變了那個界面的菜單欄,會不會那個界面中彈出的菜單欄都是同一個樣子?答案是不會的,因為通過重寫
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender這個方法可以篩選出需要的菜單項,而自定義的WebView中已經重寫了這個方法,所以在webview中彈出的菜單是需要的菜單項,在其他控件中例如TextField控件,彈出的依舊會是系統默認的菜單項,只是出於程序可讀性,可維護性考慮,最好在自定義的控件中修改菜單性,單獨封裝起來。


作者:andypan1314
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved