UIWebView的使用汇总

本文通过实例演示如何使用 UIWebView 创建简易浏览器,介绍加载网页、处理加载状态等基本操作,并分享提升用户体验的小技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UIWebView是iOS sdk中一个最常用的控件。是内置的浏览器控件,我们可以用它来浏览网页、打开文档等等。大家先看一个简单的例子,做一个简易的浏览器。如下图:

我们创建一个Window-based Application程序命名为:UIWebViewDemo

UIWebView的loadRequest可以用来加载一个url地址,它需要一个NSURLRequest参数。我们定义一个方法用来加载url。在UIWebViewDemoViewController中定义下面方法:

复制代码
- (void)loadWebPageWithString:(NSString*)urlString
{
NSURL
*url =[NSURL URLWithString:urlString];
NSLog(urlString);
NSURLRequest
*request =[NSURLRequest requestWithURL:url];
[webView loadRequest:request];
}
复制代码

在界面上放置3个控件,一个textfield、一个button、一个uiwebview,布局如下:

在代码中定义相关的控件:webView用于展示网页、textField用于地址栏、activityIndicatorView用于加载的动画、buttonPress用于按钮的点击事件。

@interface UIWebViewDemoViewController :UIViewController<UIWebViewDelegate> {    
    IBOutlet UIWebView *webView;
    IBOutlet UITextField *textField;
    UIActivityIndicatorView *activityIndicatorView;
    
}
- (IBAction)buttonPress:(id) sender;
- (void)loadWebPageWithString:(NSString*)urlString;
@end

使用IB关联他们。

设置UIWebView,初始化UIActivityIndicatorView

复制代码
- (void)viewDidLoad
{
[super viewDidLoad];
webView.scalesPageToFit
=YES;
webView.
delegate =self;
activityIndicatorView
= [[UIActivityIndicatorView alloc]
initWithFrame : CGRectMake(
0.0f, 0.0f, 32.0f, 32.0f)] ;
[activityIndicatorView setCenter: self.view.center] ;
[activityIndicatorView setActivityIndicatorViewStyle: UIActivityIndicatorViewStyleWhite] ;
[self.view addSubview : activityIndicatorView] ;
[self buttonPress:nil];
// Do any additional setup after loading the view from its nib.
}
复制代码

UIWebView主要有下面几个委托方法:

1、- (void)webViewDidStartLoad:(UIWebView *)webView;开始加载的时候执行该方法。
2、- (void)webViewDidFinishLoad:(UIWebView *)webView;加载完成的时候执行该方法。
3、- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;加载出错的时候执行该方法。

我们可以将activityIndicatorView放置到前面两个委托方法中。

复制代码
- (void)webViewDidStartLoad:(UIWebView *)webView
{
[activityIndicatorView startAnimating] ;
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
[activityIndicatorView stopAnimating];
}
复制代码

buttonPress方法很简单,调用我们开始定义好的loadWebPageWithString方法就行了:

- (IBAction)buttonPress:(id) sender
{
    [textField resignFirstResponder]; 
    [self loadWebPageWithString:textField.text];
    
}

当请求页面出现错误的时候,我们给予提示:

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
    UIAlertView *alterview = [[UIAlertView alloc] initWithTitle:@"" message:[error localizedDescription]  delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
    [alterview show];
    [alterview release];
}

总结:本文通过实现一个简单的浏览器,说明了uiwebview的方法和属性,相信通过这个例子,应该明白uiwebview的使用了。



UIWebView的几个小技巧  

一. 在UIWebView中使用flashScrollIndicators

使用UIScrollView时,我们可以使用flashScrollIndicators方法显示滚动标识然后消失,告知用户此页面可以滚动,后面还有更多内容。UIWebView内部依赖于UIScrollView,但是其没有flashScrollIndicators方法,但可以通过其他途径使用此方法,如下所示。

for (id subView in [webView subviews]) {   if ([subView respondsToSelector:@selector(flashScrollIndicators)]) {     [subView flashScrollIndicators];   } }

上述代码片段可以到webViewDidFinishLoad回调中使用,加载完网页内容后flash显示滚动标识。

二.去除UIWebView的背景阴影

假设一个UIWebView是白底黑字的,当用户拖动UIWebView时,会看到后面的背景阴影。可以使用下述代码去除阴影,并将背景设为白色。

if ([[webView subviews] count] > 0) {   // hide the shadows   for (UIView* shadowView in [[[webView subviews] objectAtIndex:0] subviews]) {     [shadowView setHidden:YES];   }   // show the content   [[[[[webView subviews] objectAtIndex:0] subviews] lastObject] setHidden:NO]; } webView.backgroundColor = [UIColor whiteColor];

三.根据内容获取UIWebView的高度

有时候需要根据不同的内容调整UIWebView的高度,以使UIWebView刚好装下所有内容,不用拖动,后面也不会留白。有两种方式可根据加载内容获取UIWebView的合适高度,但都需要在网页内容加载完成后才可以,即需要在webViewDidFinishLoad回调中使用。

1.使用sizeThatFits方法。

- (void)webViewDidFinishLoad:(UIWebView *)webView {     CGRect frame = webView.frame;     frame.size.height = 1;     webView.frame = frame;     CGSize fittingSize = [webView sizeThatFits:CGSizeZero];     frame.size = fittingSize;     webView.frame = frame; } 

sizeThatFits方法有个问题,如果当前UIView的大小比刚好合适的大小还大,则返回当前的大小,不会返回最合适的大小值,所以使用sizeThatFits前,先将UIWebView的高度设为最小,即1,然后再使用sizeThatFits就会返回刚好合适的大小。

2.使用JavaScript

  - (void)webViewDidFinishLoad:(UIWebView *)webView {     CGRect frame = webView.frame;     NSString *fitHeight = [webview stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight;"];     frame.size.height = [fitHeight floatValue];     webView.frame = frame; }

使用UIWebView的stringByEvaluatingJavaScriptFromString方法,执行JavaScript语句document.body.scrollHeight;可获取当前网页正文的全文高,测试时曾错误的使用了document.body.offsetHeight。

3.限制

这两种方法都只能在加载网页完成时才能使用,当在UITableView中的UITableViewCell包含UIWebView时,无法在tableView:heightForRowAtIndexPath:中获取到UIWebView最合适的高度,也就无法确定UITableViewCell的合适高度。

UIWebView加载Loading...两种方法

第一种方法:使用UIView and UIActivityIndicatorView
//创建UIWebView
WebView =[[UIWebView alloc]initWithFrame:CGRectMake(044320400)];
[WebView setUserInteractionEnabled:NO];
[WebView setBackgroundColor:[UIColor clearColor]];
[WebView setDelegate:self];
[WebView setOpaque:NO];//使网页透明
 
NSString*path= @"http://www.baidu.com";
NSURL*url=[NSURLURLWithString:path];
[WebView loadRequest:[NSURLRequestrequestWithURL:url]];
 
//创建UIActivityIndicatorView背底半透明View    
UIView *view=[[UIView alloc]initWithFrame:CGRectMake(00320480)];
[viewsetTag:103];
[viewsetBackgroundColor:[UIColor blackColor]];
[viewsetAlpha:0.8];
[self.viewaddSubview:view];
 
activityIndicator =[[UIActivityIndicatorView alloc]initWithFrame:CGRectMake(0.0f, 0.0f, 32.0f, 32.0f)];
[activityIndicator setCenter:view.center];
[activityIndicator setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhite];
[viewaddSubview:activityIndicator];
[self.viewaddSubview:WebView];
[viewrelease];
[WebView release];
 
//开始加载数据
-(void)webViewDidStartLoad:(UIWebView *)webView {    
      [activityIndicator startAnimating];         
}
 
//数据加载完
-(void)webViewDidFinishLoad:(UIWebView *)webView {
     [activityIndicator stopAnimating];    
     UIView *view=(UIView *)[self.viewviewWithTag:103];
     [viewremoveFromSuperview];
}


第二种方法:使用UIAlertView and UIActivityIndicatorView
//加载网页动画
-(void)webViewDidStartLoad:(UIWebView *)webView{
    if(myAlert==nil){        
       myAlert =[[UIAlertView alloc]initWithTitle:nil
                                                              message: @"正在讀取網路資料"delegate:self
                                                 cancelButtonTitle:nil
                                                 otherButtonTitles:nil];
 
     UIActivityIndicatorView *activityView =[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
     activityView.frame= CGRectMake(120.f, 48.0f, 37.0f, 37.0f);
     [myAlert addSubview:activityView];
     [activityView startAnimating];
     [myAlert show];
     }
}
 
-(void)webViewDidFinishLoad:(UIWebView *)webView{
      [myAlert dismissWithClickedButtonIndex:0 animated:YES];

}


/*=======================================*/

用法一:只显示不停旋转的进度滚轮指示器。

//显示进度滚轮指示器

-(void)showWaiting {

 

progressInd=[[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:

  UIActivityIndicatorViewStyleWhiteLarge];

progressInd.center=CGPointMake(self.view.center.x,240);

[self.navigationController.view addSubview:progressInd];

[progressInd startAnimating];

}

//消除滚动轮指示器

-(void)hideWaiting 

{

[progressInd stopAnimating];

}



用法二:带有半透明背景的进度轮指示器。

 

//显示进度滚轮指示器

-(void)showWaiting:(UIView *)parent {

 

    int width = 32, height = 32;

    

    CGRect frame = CGRectMake(100, 200, 110, 70) ;//[parent frame]; //[[UIScreen mainScreen] applicationFrame];

    int x = frame.size.width;

    int y = frame.size.height;

    

    frame = CGRectMake((x - width) / 2, (y - height) / 2, width, height);

    UIActivityIndicatorView* progressInd = [[UIActivityIndicatorView alloc]initWithFrame:frame];

    [progressInd startAnimating];

    progressInd.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;

    

frame = CGRectMake((x - 70)/2, (y - height) / 2 + height, 8020);

UILabel *waitingLable = [[UILabel allocinitWithFrame:frame];

waitingLable.text = @"Loading...";

waitingLable.textColor = [UIColor whiteColor];

waitingLable.font = [UIFont systemFontOfSize:15];

waitingLable.backgroundColor = [UIColor clearColor];

 

    frame =  CGRectMake(10020011070) ;//[parent frame];

    UIView *theView = [[UIView allocinitWithFrame:frame];

    theView.backgroundColor = [UIColor blackColor];

    theView.alpha = 0.7;

    

    [theView addSubview:progressInd];

[theView addSubview:waitingLable];

    

    [progressInd release];

[waitingLable release];

    

    [theView setTag:9999];

    [parent addSubview:theView];

    [theView release];

}


//消除滚动轮指示器

-(void)hideWaiting 

{

    [[self.view viewWithTag:9999] removeFromSuperview];

}


关于UIWebView的高度问题

 

 三种方法:

- (void)webViewDidFinishLoad:(UIWebView *)webView 

    //1

//    CGFloat webViewHeight = 0.0f; 

//    if (webView.subviews.count > 0)  

//    { 

//        UIView *scrollerView = [webView.subviews objectAtIndex:0];//为什么要取第一个? 

//        if (scrollerView.subviews.count > 0)  

//        { 

//            UIView *webDocView = scrollerView.subviews.lastObject; 

//            if ([webDocView isKindOfClass:[NSClassFromString(@"UIWebDocumentView") class]]) 

//            { 

//                webViewHeight = webDocView.frame.size.height;//获取文档的高度 

//                webView.frame= webDocView.frame; //更新UIWebView 的高度                 

//            } 

//        } 

//    } 


       //2 

//    CGSize actualSize = [webView sizeThatFits:CGSizeZero]; 

//    CGRect newFrame = webView.frame;

//    newFrame.size.height = actualSize.height;

//    webView.frame = newFrame;

    


    //3

    CGFloat webViewHeight=[webView.scrollView contentSize].height;

    CGRect newFrame = webView.frame;

    newFrame.size.height = webViewHeight;

    webView.frame = newFrame;

    



内容概要:本文档详细介绍了基于MATLAB实现多目标差分进化(MODE)算法进行无人机三维路径规划的项目实例。项目旨在提升无人机在复杂三维环境中路径规划的精度、实时性、多目标协调处理能力、障碍物避让能力和路径平滑性。通过引入多目标差分进化算法,项目解决了传统路径规划算法在动态环境和多目标优化中的不足,实现了路径长度、飞行安全距离、能耗等多个目标的协调优化。文档涵盖了环境建模、路径编码、多目标优化策略、障碍物检测与避让、路径平滑处理等关键技术模块,并提供了部分MATLAB代码示例。 适合人群:具备一定编程基础,对无人机路径规划和多目标优化算法感兴趣的科研人员、工程师和研究生。 使用场景及目标:①适用于无人机在军事侦察、环境监测、灾害救援、物流运输、城市管理等领域的三维路径规划;②通过多目标差分进化算法,优化路径长度、飞行安全距离、能耗等多目标,提升无人机任务执行效率和安全性;③解决动态环境变化、实时路径调整和复杂障碍物避让等问题。 其他说明:项目采用模块化设计,便于集成不同的优化目标和动态环境因素,支持后续算法升级与功能扩展。通过系统实现和仿真实验验证,项目不仅提升了理论研究的实用价值,还为无人机智能自主飞行提供了技术基础。文档提供了详细的代码示例,有助于读者深入理解和实践该项目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值