写代码之前先讲一个小笑话:有一个程序员有一天捡到了一个拉丁神灯,然后神灯说:‘’你许一个愿望吧。“程序员说:”我希望我的生命中能做一个不改需求的项目“。然后,这个程序员成为了永恒...
狂吐槽
几乎所有的程序员都希望做一个不改需求的程序,但是这个愿望几乎不能实现。我的愿望很简单,就是做一些需求改的比较少的项目,但是这一点最近也不能实现了。前一段时间不要命的连续写项目两个星期(是一直赶项目),你们应该知道赶项目累的情况。终于在昨天赶完了。满以为可以小小的休息一下,没想到更大的厄运即将到来。今天项目总监说:咱们要把大部分界面做成webView。我心中一万个草泥马奔腾而过。不要以为做成webView多简单,我们还要有大量的JS和OC的交互。今天把平时虽然常用但是却了解不太深入的webView有系统的看了一下。
/
有的时候项目在加载webView的时候会有一个需求,就是想要一个加载条,但是webView并没有加载条,而且我们也不能知道加载一个webView所需要的时间。这时就需要我们做一些邪门歪道了,据说微信也是这么做的。就是进度条是个假象,先进度到90%,然后等待加载完毕,完毕后瞬间进度到100%。iOS里面有进度条,我们可以直接用,但是进度加载的时候,我们不要加载太快了。
加载webView
_webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREENH_HEIGHT)];
_webView.backgroundColor = white;
NSMutableString *URL = [NSMutableString stringWithFormat:@"http://www.jijianshangcheng.com/Index/url?id=%@",self.MYID];
NSURLRequest *request =[NSURLRequest requestWithURL:[NSURL URLWithString:URL]];
[self.view addSubview: _webView];
[_webView loadRequest:request];
清除webView的缓存
//清除webView的缓存
[[NSURLCache sharedURLCache] removeAllCachedResponses];
//清除cookies
NSHTTPCookie *cookie;
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (cookie in [storage cookies]) {
[storage deleteCookie:cookie];
}
//加载请求的时候忽略缓存
self.request = [NSURLRequest requestWithURL:[NSURL URLWithString:htmlString] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:5.0];
webView代理方法
UIWebView的代理方法,当webview开始加载请求的时候回去调用,可以拦截一些用户的行为是否加载。返回YES代表允许加载,返回NO代表停止加载。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
// webView加载开始的时候调用。
- (void)webViewDidStartLoad:(UIWebView *)webView;
// webView加载完毕的时候调用。
- (void)webViewDidFinishLoad:(UIWebView *)webView;
// webView加载失败的时候调用
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;
我们可以在APP上控制webView的前进后退刷新,需要使用的时候可以直接调用
// webView加载刷新
- (void)reload;
// webView停止加载
- (void)stopLoading;
// 当webView跳转了一个网页时,执行goBack可以回退到之前的界面。
- (void)goBack;
//13..执行goForward前进一个之前跳过的界面
- (void)goForward;
其他一些常用属性
//只读型bool值,用来判断当前页面是否可以回退
@property (nonatomic, readonly, getter=canGoBack) BOOL canGoBack;
// 只读型bool值,用来判断当前页面是否可以前进
@property (nonatomic, readonly, getter=canGoForward) BOOL canGoForward;
// 只读型bool值,用来判断当前页面是否可以加载刷新
@property (nonatomic, readonly, getter=isLoading) BOOL loading;
// 这个方法需要等到webView加载完毕之后才会调用,通过它我们可以很方便的操作UIWebView中的页面元素。参数script用来传进当前页面文件元素字符串,对传进来的字符串进行相应的操作,例如[webview stringByRvaluaingJavaScriptFromString:@“document.title”],可以得到页面的title
- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
// 是否让内容伸缩至适应屏幕当前尺寸
@property (nonatomic) BOOL scalesPageToFit;
// 这个属性如果设置为YES,当进入到页面视图可以自动检测电话号码,让用户可以单机号码进行拨打,不过现已弃用。
@property (nonatomic) BOOL detectsPhoneNumbers NS_DEPRECATED_IOS(2_0, 3_0);
// 这个属性可以设定使电话号码,网址,电子邮件和符合格式的日期等文字变为连接文字。
@property (nonatomic) UIDataDetectorTypes dataDetectorTypes NS_AVAILABLE_IOS(3_0);
// 这个属性决定了页面用内嵌HTML5播放视频还是用本地的全屏控制。为了内嵌视频播放,不仅仅需要在这个页面上设置这个属性,还需要在HTML的viedeo元素必须包含webkit-playsinline属性。默认iPhone为NO,iPad为YES。
@property (nonatomic) BOOL allowsInlineMediaPlayback NS_AVAILABLE_IOS(4_0); // iPhone Safari defaults to NO. iPad Safari defaults to YES
// .这个属性决定了HTML5视频可以自动播放还是需要用户启动播放。iPhone和iPad默认都是YES。
@property (nonatomic) BOOL mediaPlaybackRequiresUserAction NS_AVAILABLE_IOS(4_0); // iPhone and iPad Safari both default to YES
// 这个属性决定了从这个页面是否可以Air Play。iPhone和iPad上都是默认YES。
@property (nonatomic) BOOL mediaPlaybackAllowsAirPlay NS_AVAILABLE_IOS(5_0); // iPhone and iPad Safari both default to YES
// 这个值决定了网页内容的渲染是否在把内容全部假爱到内存中再去处理。如果设置为YES,只有网页内容加载到内存里了才会去渲染。默认为NO。
@property (nonatomic) BOOL suppressesIncrementalRendering NS_AVAILABLE_IOS(6_0); // iPhone and iPad Safari both default to NO
// 这个属性如果设置为YES,用户必须明确的点击页面上的元素或者相关联的输入页面来显示键盘,。如果设置为NO,一个元素的焦点事件就会导致输入视图的显示和自动关联这个元素。
@property (nonatomic) BOOL keyboardDisplayRequiresUserAction
UIWebViewNavigationType枚举定义了页面中用户行为的分类
typedef NS_ENUM(NSInteger, UIWebViewNavigationType) {
UIWebViewNavigationTypeLinkClicked,//用户触发了一个链接
UIWebViewNavigationTypeFormSubmitted,//用户提交了一个表单
UIWebViewNavigationTypeBackForward,//用户触击前进前进或返回按钮
UIWebViewNavigationTypeReload,//用户触击重新加载的按钮
UIWebViewNavigationTypeFormResubmitted,//用户重复提交表单
UIWebViewNavigationTypeOther//发生了其他行为
};