iOS开发实用技术

利用KVO设置网页的一些属性

2016-02-29  本文已影响747人  Alexander

@WilliamAlex大叔的微博一起学习iOS

思路: 以前访问网页的控件功能相对来说有个缺点: 有的有返回,前进或者是监听进度的进度条,但是必须要借助其它应用才能打开,也有在当前应用就能打开网页的,但是,却没有上述的一些功能.以下介绍两种方法来介绍如何打开一个网页.

SFSafariViewController展示网页:1.webView 2.openUrl
webView:没有自带功能,好处,就在当前应用下展示网页,webView不能监听进度条
safari:自带了很多功能,弊端:必须要跳转到其他应用
在当前应用下展示网页,但是有safari功能,自定义view,进度条,前进,后退,刷新功能,网址.
iOS9 SFSafariViewController:具备safari功能,并且可以在当前应用下展示网页
只能在iOS9使用

//  1.首先导入一个框架
 #import <SafariServices/SafariServices.h>

方法一 :

// 背景介绍: 创建一个流水布局,当点击流水布局中的cell时,就跳转到对应的网页.
步骤:
1, 定义了个模型类,声明url属性
2, 导入框架: #import <SafariServices/SafariServices.h>
3, 遵守代理,并设置代理
4, 实现代理方法
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{

   // 取出模型
   WGSquareItem *item = self.topics[indexPath.row];

   // 判断模型中的url是否是"http"
   if ([item.url hasPrefix:@"http"]) {

       // 跳转界面
       SFSafariViewController *safarVc = [[SFSafariViewController alloc] initWithURL:[NSURL URLWithString:item.url]];

       safarVc.hidesBottomBarWhenPushed = YES;

       [self.navigationController pushViewController:safarVc animated:YES];
   }
}

方法二 :

// 声明属性和监听对应的控件的变化
#import "WGWebViewController.h"
#import <WebKit/WebKit.h>

@interface WGWebViewController () <UIWebViewDelegate>

/** 网页 */
@property (nonatomic, weak) WKWebView *webView;
/** 监听网页占位视图 */
@property (weak, nonatomic) IBOutlet UIView *htmlView;
/** 监听返回 */
@property (weak, nonatomic) IBOutlet UIBarButtonItem *backItem;
/** 监听前进 */
@property (weak, nonatomic) IBOutlet UIBarButtonItem *forwardItem;
/** 监听进度条 */
@property (weak, nonatomic) IBOutlet UIProgressView *progressView;
@end
@implementation WGWebViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self loadWebView];
}

#pragma mark - 加载网页
- (void)loadWebView {

    // 加载网页
    WKWebView *webView = [[WKWebView alloc] init];
    [self.htmlView addSubview:webView];
    self.webView = webView;

    // 加载请求
    NSURLRequest *request = [NSURLRequest requestWithURL:_url];
    [_webView loadRequest:request];

    // 前进,后退,刷新,进度条,网页信息
    // Observer;观察者
    // KeyPath:观察哪个属性
    // options:观察新值
    // KVO:监听属性
    [_webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];
    [_webView addObserver:self forKeyPath:@"goBack"            options:NSKeyValueObservingOptionNew context:nil];
    [_webView addObserver:self forKeyPath:@"title"             options:NSKeyValueObservingOptionNew context:nil];
    [_webView addObserver:self forKeyPath:@"goForward"         options:NSKeyValueObservingOptionNew context:nil];

}

#pragma mark - 移除KVO
- (void)dealloc
{
    [_webView removeObserver:self forKeyPath:@"title"];
    [_webView removeObserver:self forKeyPath:@"goBack"];
    [_webView removeObserver:self forKeyPath:@"goForward"];
    [_webView removeObserver:self forKeyPath:@"estimatedProgress"];

}
#pragma mark - 布局
- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];
    _webView.frame = _htmlView.bounds;
}
#pragma mark - 监听是否有新值
/**
 *  只要是用KVO监听,只要有新值就会调用该方法
 */
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
    _backItem.enabled = _webView.canGoBack;
    _forwardItem.enabled = _webView.canGoForward;
    _progressView.progress = _webView.estimatedProgress;
    _progressView.hidden = _webView.estimatedProgress >= 1;
    self.title = _webView.title;
}
#pragma mark - 事件监听

- (IBAction)goBack:(UIBarButtonItem *)sender {
    [self.webView goBack];
}
- (IBAction)goForward:(UIBarButtonItem *)sender {
    [self.webView goForward];
}
- (IBAction)reload:(UIBarButtonItem *)sender {
    [self.webView reload];
}

上一篇下一篇

猜你喜欢

热点阅读