YHExplorerView.m 4.28 KB
//
//  YHExplorerView.m
//  YohoExplorerDemo
//
//  Created by gaoqiang xu on 3/2/15.
//  Copyright (c) 2015 gaoqiang xu. All rights reserved.
//

#import "YHExplorerView.h"

@interface YHExplorerView ()
<UIGestureRecognizerDelegate>
@property (readwrite, strong, nonatomic) YHExplorerViewController *webViewController;
@property (strong, nonatomic) NSString *url;
@property (assign, nonatomic) BOOL isLoaded;

@end

@implementation YHExplorerView

- (instancetype)initWithFrame:(CGRect)frame withNaviBar:(UIView *)naviBar
{
    self = [self initWithFrame:frame];
    self.currentNaviBar = naviBar;
    return self;
}

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self _initialize];
    }
    
    return self;
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self _initialize];
    }
    
    return self;
}

- (void)_initialize {
    self.isLoaded = NO;
}

- (void)setUrl:(NSString *)url
{
    // 检验url是否能正常转成NSURL,防止webview不能加载
    BOOL isValidUrl = ([NSURL URLWithString:url] != nil);
    
    if (url.length > 0
        && !isValidUrl) {
        // 如果url里面含有需要转码的字符,则这里进行一次编码
        _url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    } else {
        _url = url;
    }
}

- (void)didMoveToSuperview
{
    if (!self.superview) {
        return;
    }
}

- (void)didMoveToWindow
{
    if (!self.window) {
        return;
    }
    
    if (!self.isLoaded) {
        [self addSubview:self.webViewController.view];
        self.isLoaded = YES;
        if (self.url.length > 0) {
            [self.webViewController loadWebUrl:self.url];
        }
    }
}

- (void)layoutSubviews
{
    [super layoutSubviews];
    
    if (self.isLoaded) {
        self.webViewController.view.frame = self.bounds;
    }
}

#pragma mark - Public
- (void)loadWebUrl:(NSString *)url
{
    self.url = url;
    if (self.isLoaded) {
        [self.webViewController loadWebUrl:self.url];
    }
}

- (void)loadHTMLString:(NSString *)html
{
    if (self.isLoaded) {
        [self.webViewController loadHTMLString:html];
    }
}

- (void)loadHTMLString:(NSString *)html baseURL:(nullable NSURL *)baseURL
{
    if (self.isLoaded) {
        [self.webViewController loadHTMLString:html baseURL:baseURL];
    }
}

- (void)setProgressBarColor:(UIColor *)color
{
    [self.webViewController setProgressBarColor:color];
}

#pragma mark - Override Setter & Getter
- (YHExplorerViewController *)webViewController
{
    if (!_webViewController) {
        _webViewController = [[YHExplorerViewController alloc] initWithCurrentNaviBar:self.currentNaviBar];
    }
    return _webViewController;
}

- (WKWebView *)webView
{
    return self.webViewController.webView;
}

#pragma mark - Setters

- (void)setDelegate:(id<YHExplorerDelegate>)delegate
{
    self.webViewController.delegate = delegate;
}

- (id<YHExplorerDelegate>)delegate
{
    return self.webViewController.delegate;
}

- (void)setEnableProgressBar:(BOOL)enableProgressBar
{
    self.webViewController.currentNaviBar = self.currentNaviBar;
    self.webViewController.progressBarEnabled = enableProgressBar;
    
}

- (BOOL)enableProgressBar
{
    return self.webViewController.progressBarEnabled;
}

#pragma mark - Method Forwarding
- (BOOL)respondsToSelector:(SEL)aSelector
{
    if ([super respondsToSelector:aSelector]) {
        return YES;
    }
    
    if ([self.webViewController respondsToSelector:aSelector]) {
        return YES;
    }
    
    return NO;
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
    NSMethodSignature *signature = [super methodSignatureForSelector:aSelector];
    if (!signature) {
        if (self.webViewController && [self.webViewController respondsToSelector:aSelector]) {
            return [(NSObject *)self.webViewController methodSignatureForSelector:aSelector];
        }
    }
    
    return signature;
}

- (void)forwardInvocation:(NSInvocation *)anInvocation
{
    if (self.webViewController && [self.webViewController respondsToSelector:[anInvocation selector]]) {
        [anInvocation invokeWithTarget:self.webViewController];
    }
}

//移除滚动条
- (void)removeProgress
{
    [self.webViewController removeProgress];
}

@end