(IOS)h5页面自带导航栏情况下给WebView添加预加载导航

2018-11-16  本文已影响0人  rightmost

h5页面自带导航栏情况下,在h5页面还没有加载出来之前,页面是空白的,这样很尴尬,用户体验非常差,如果加载非常慢或者加载失败的情况下,会一直处于空白页中,无法返回。

解决方案有:1.利用原生导航,2.h5添加预加载页面和错误页面,3自定义当航栏

经过尝试,我发现1,2两种方案都有一定的弊端,所以我选择了第三种方案自定义预加载当航栏。

首先自定义一个BaseWebController

.h

#import "BaseViewController.h"

NS_ASSUME_NONNULL_BEGIN

@interfaceBaseWebController :BaseViewController

//添加预加载导航栏

-(void)addPreloadPageNav;

//显示预加载导航栏

-(void)showPreloadPageNav;

//隐藏预加载导航栏

-(void)hidePreloadPageNav;

//移除预加载导航栏

-(void)removePreloadPageNav;

//预加载导航栏标题

-(void)preloadPageNavTitle:(NSString*)title;

//移除进度条

-(void)removeProgressView;

@end

NS_ASSUME_NONNULL_END

.m文件

@interface BaseWebController ()

//导航

@property (nonatomic,strong) UIView *preloadPageNav;

//标题

@property(nonatomic,strong)UILabel*preloadPageNavTitle;

//进度条

@property (nonatomic, strong) UIProgressView *progressView;

@property (nonatomic, strong) NSTimer *timer;

@end

@implementationBaseWebController

-(void)viewWillAppear:(BOOL)animated{

    [self.navigationController setNavigationBarHidden:YES animated:NO];

    [superviewWillAppear:animated];

}

- (void)viewWillDisappear:(BOOL)animated {

    [super viewWillDisappear:animated];

    [self.navigationController setNavigationBarHidden:NO animated:NO];

}

- (void)viewDidLoad {

    [super viewDidLoad];

}

//添加预加载导航栏

-(void)addPreloadPageNav{

    self.preloadPageNav=[UIView new];

    [self.view addSubview:self.preloadPageNav];

    [self.preloadPageNav mas_makeConstraints:^(MASConstraintMaker *make) {

        make.top.mas_equalTo(self.view);

        make.size.mas_equalTo(CGSizeMake(kScreenWidth, 64));

    }];

    self.preloadPageNav.backgroundColor=[UIColor colorWithHexString:@"#ec403c"];

    UIButton*navBackBtn=[UIButtonnew];

    [self.preloadPageNavaddSubview:navBackBtn];

    [navBackBtnmas_makeConstraints:^(MASConstraintMaker*make) {

        make.centerY.mas_equalTo(self.preloadPageNav).offset(10);

        make.left.mas_equalTo(self.preloadPageNav).mas_offset(20);

    }];

    [navBackBtnsetImage:[UIImage imageNamed:@"ic_back"] forState:UIControlStateNormal];

    [navBackBtnaddTarget:self action:@selector(navBackBtnClick) forControlEvents:UIControlEventTouchUpInside];

    navBackBtn.imageEdgeInsets=UIEdgeInsetsMake(0, -15,0,0);

    navBackBtn.titleEdgeInsets=UIEdgeInsetsMake(0, -5,0,0);

    [navBackBtnsetTitle:@"返回" forState:UIControlStateNormal];

    navBackBtn.titleLabel.font= [UIFontsystemFontOfSize:16];

    [navBackBtnsetTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];

    self.preloadPageNavTitle=[UILabel new];

    [self.preloadPageNav addSubview:self.preloadPageNavTitle];

    [self.preloadPageNavTitle mas_makeConstraints:^(MASConstraintMaker *make) {

        make.centerY.mas_equalTo(self.preloadPageNav).offset(10);

        make.centerX.mas_equalTo(self.preloadPageNav);

    }];

    self.preloadPageNavTitle.textColor=[UIColor whiteColor];

    self.preloadPageNavTitle.font=[UIFont systemFontOfSize:17];

    self.progressView = [UIProgressView new];

    [self.preloadPageNav addSubview:self.progressView];

    [self.progressView mas_makeConstraints:^(MASConstraintMaker *make) {

        make.top.equalTo(self.preloadPageNav.mas_bottom);

        make.size.mas_equalTo(CGSizeMake(kScreenWidth, 2));

    }];

    self.progressView.progressTintColor=[UIColor blueColor];

    self.progressView.trackTintColor=[UIColor clearColor];

     self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(progress) userInfo:nil repeats:true];

}

- (void)progress{

    if (self.progressView.progress<0.5) {

        self.progressView.progress+=0.2;

    }else{

        self.progressView.progress+=0.3;

    }

    if(self.progressView.progress==1) {

        [self.timerinvalidate];

        [self.progressView removeFromSuperview];

        NSLog(@"accomplish");

    }

}

-(void)removeProgressView{

     [self.progressView removeFromSuperview];

}

//显示预加载导航栏

-(void)showPreloadPageNav{

    if (self.preloadPageNav) {

        self.preloadPageNav.hidden=NO;

    }else{

        [self addPreloadPageNav];

    }

}

//隐藏预加载导航栏

-(void)hidePreloadPageNav{

    if (self.preloadPageNav) {

        self.preloadPageNav.hidden=YES;

    }

}

//移除预加载导航栏

-(void)removePreloadPageNav{

    if (self.preloadPageNav) {

        [self.preloadPageNav removeFromSuperview];

    }

}

//预加载导航栏标题

-(void)preloadPageNavTitle:(NSString*)title{

    self.preloadPageNavTitle.text=title;

}

//返回按钮点击事件

-(void)navBackBtnClick{

    [self.navigationController popViewControllerAnimated:YES];

}

@end

然后创建一个ViewController继承于上面的BaseWebController

- (void)viewDidLoad {

定义并创建webView;

 [self addPreloadPageNav];//添加预加载导航栏

  [self preloadPageNavTitle:@"标题"];//添加标题

}

- (void)webViewDidFinishLoad:(UIWebView*)webView{

    [self hidePreloadPageNav];//h5页面加载完成方法里隐藏自定义导航

    NSLog(@"地址:%@\n",[webView.request.URL absoluteString]);

}

#pragma mark -webview加载失败的回调

- (void)webView:(UIWebView*)webView didFailLoadWithError:(NSError*)error

{

    [self showPreloadPageNav];//h5页面加载失败方法里展示自定义导航

}

上一篇下一篇

猜你喜欢

热点阅读