All Projects → devedbox → Axwebviewcontroller

devedbox / Axwebviewcontroller

Licence: mit
AXWebViewController is a webViewController to browse web content inside applications. It’s a lightweight controller on iOS platform based on WKWebView (UIWebView would be the base Kit under iOS 8.0). It added navigation tool bar to refresh, go back, go forward and so on. It support the navigation style on WeChat. It is a simple-using and convenient web view controller using inside applications.

Projects that are alternatives of or similar to Axwebviewcontroller

Multi
Create a custom, lightweight macOS app from a group of websites
Stars: ✭ 755 (-1.95%)
Mutual labels:  webview, webkit
Google-Docs-for-Mac
Native Google Docs app for Mac
Stars: ✭ 33 (-95.71%)
Mutual labels:  webview, webkit
webviewhs
🌐 A Haskell binding to the webview library created by Serge Zaitsev.
Stars: ✭ 109 (-85.84%)
Mutual labels:  webview, webkit
Mybrowser
我的浏览器,基于WKWebView实现的一个iOS浏览器,实现了无图模式、广告拦截、多窗口、扫描二维码、收藏夹/历史、无痕浏览、夜间模式等功能...
Stars: ✭ 127 (-83.51%)
Mutual labels:  webview, webkit
Swiftwebvc
A drop-in inline browser for your Swift iOS app.
Stars: ✭ 307 (-60.13%)
Mutual labels:  cocoapods, webview
Complimentarygradientview
Create complementary gradients generated from dominant and prominent colors in supplied image. Inspired by Grade.js
Stars: ✭ 691 (-10.26%)
Mutual labels:  cocoapods
Gradients
🌔 A curated collection of splendid 180+ gradients made in swift
Stars: ✭ 719 (-6.62%)
Mutual labels:  cocoapods
Bluecap
iOS Bluetooth LE framework
Stars: ✭ 669 (-13.12%)
Mutual labels:  cocoapods
Interactivesidemenu
iOS Interactive Side Menu written in Swift.
Stars: ✭ 668 (-13.25%)
Mutual labels:  cocoapods
Xcodebenchmark
XcodeBenchmark measures the compilation time of a large codebase on iMac, MacBook, and Mac Pro
Stars: ✭ 736 (-4.42%)
Mutual labels:  cocoapods
Txscrolllabelview
🌭TXScrollLabelView, the best way to show & display information such as adverts / boardcast / onsale e.g. with a customView.
Stars: ✭ 714 (-7.27%)
Mutual labels:  cocoapods
Uiimageview Letters
UIImageView category for using initials as a placeholder image, written in Objective-C. For a Swift implementation, see https://github.com/bachonk/InitialsImageView
Stars: ✭ 694 (-9.87%)
Mutual labels:  cocoapods
Zephyr
Effortlessly synchronize UserDefaults over iCloud.
Stars: ✭ 722 (-6.23%)
Mutual labels:  cocoapods
Agemojikeyboard
Emoji Keyboard for iOS
Stars: ✭ 686 (-10.91%)
Mutual labels:  cocoapods
Blockhook
Hook Objective-C blocks. A powerful AOP tool.
Stars: ✭ 742 (-3.64%)
Mutual labels:  cocoapods
Zoomtransitioning
ZoomTransitioning provides a custom transition with image zooming animation and swiping the screen edge.
Stars: ✭ 670 (-12.99%)
Mutual labels:  cocoapods
Shiny
Iridescent Effect View (inspired by Apple Pay Cash) ✨
Stars: ✭ 707 (-8.18%)
Mutual labels:  cocoapods
Defaults
Swifty and modern UserDefaults
Stars: ✭ 734 (-4.68%)
Mutual labels:  cocoapods
Notepad
[iOS] A fully themeable markdown editor with live syntax highlighting.
Stars: ✭ 705 (-8.44%)
Mutual labels:  cocoapods
Validatedpropertykit
Easily validate your Properties with Property Wrappers 👮
Stars: ✭ 701 (-8.96%)
Mutual labels:  cocoapods

AXWebViewController

BuildVersionLicensePlatform996.icu

Summary

AXWebViewController是一款基于WKWebView(WebKit)封装的view controller,高度集成,一行代码即可使用;能够满足大部分的App加载html网页的场景,AXWebViewController实现了WKUIDelegateWKNavigationDelegate两个协议,在使用过程中,若需要自定义功能,可自行Overrides相关方法予以实现;

AXWebViewController可实现微信样式的网页浏览导航控制,可在导航栏显示返回关闭两个功能按钮,这个功能主要基于AXNavigationBackItemInjection而实现,AXNavigationBackItemInjection可以拦截点击返回导航或者手势滑动返回,有兴趣的朋友可以了解了解!

sample2 sample

视频链接

Features

  • 手势滑动返回上个页面
  • 微信样式导航返回、关闭
  • 网页加载失败提示
  • 网页加载进度提示
  • 网页来源host提示
  • 支持__Peek__和__Pop__浏览网页,并且commit之后在本网页进行加载,不用跳转到Safari进行浏览,这里使用到了很多运行时的方法,因此,谨慎使用!

Requirements

AXWebViewController 对系统版本支持到iOS7.0;版本0.7.0以后仅支持Xcode9,需要使用到:

  • Foundation.framework
  • UIKit.framework

使用的时候最好使用最新版Xcode。

Adding AXWebViewController to your projet

CocoaPods

CocoaPods is the recommended way to add AXWebViewController to your project.

  1. Add a pod entry for AXWebViewController to your Podfile pod 'AXWebViewController', '~> 0.6.0'
  2. Install the pod(s) by running pod install.
  3. Include AXWebViewController wherever you need it with #import "AXWebViewController.h".

Source files

Alternatively you can directly add the source files under path */AXWebViewController/ to your project.

  1. Download the latest code version or add the repository as a git submodule to your git-tracked project.
  2. Open your project in Xcode, then drag and drop the source files onto your project (use the "Product Navigator view"). Make sure to select Copy items when asked if you extracted the code archive outside of your project.
  3. Include AXWebViewController wherever you need it with #import "AXWebViewController.h".

License

This code is distributed under the terms and conditions of the MIT license.

Usage

AXWebViewController使用和使用普通UIViewController一样简单,只需要在需要使用的地方使用URL初始化即可:

AXWebViewController *webVC = [[AXWebViewController alloc] initWithAddress:@"http://www.baidu.com"];
webVC.showsToolBar = NO;
webVC.navigationController.navigationBar.translucent = NO;
self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:0.100f green:0.100f blue:0.100f alpha:0.800f];
self.navigationController.navigationBar.barTintColor = [UIColor colorWithRed:0.996f green:0.867f blue:0.522f alpha:1.00f];
[self.navigationController pushViewController:webVC animated:YES];

使用工具条导航

使用工具条只需在AXWebViewController初始化之后加入一句代码:

webVC.navigationType = AXWebViewControllerNavigationToolItem;
webVC.showsToolBar = YES;

注意,在设置navigationTypeAXWebViewControllerNavigationToolItem之后,须确认showsToolBarYES才能生效.

使用微信样式导航

AXWebViewController初始化之后加入一句代码:

webVC.navigationType = AXWebViewControllerNavigationBarItem;

即可生效.

Peek&Pop

Peek和Pop使用的是原生的系统功能,在使用的时候只需要将webView.allowsLinkPreview设置为YES即可使用,这里需要注意下,在实现Peek和Pop的时候,使用了Runtime的相关知识,而且使用AOP的一个框架__Aspects__进行了编程,在使用的过程中可能会出错,当然,出错的几率也是很小的(苹果不可能隔三差五的去修改自家的Private API吧= =),实现原理就不多讲了,基本上就是运行时的一些知识,代码如下:


- (void)hookWebContentCommitPreviewHandler {
    // Find the `WKContentView` in the webview.
    __weak typeof(self) wself = self;
    for (UIView *_view in _webView.scrollView.subviews) {
    if ([_view isKindOfClass:NSClassFromString(@"WKContentView")]) {
    id _previewItemController = object_getIvar(_view, class_getInstanceVariable([_view class], "_previewItemController"));
    Class _class = [_previewItemController class];
    SEL _performCustomCommitSelector = NSSelectorFromString(@"previewInteractionController:interactionProgress:forRevealAtLocation:inSourceView:containerView:");
    [_previewItemController aspect_hookSelector:_performCustomCommitSelector withOptions:AspectPositionAfter usingBlock:^() {
        UIViewController *pred = [_previewItemController valueForKeyPath:@"presentedViewController"];
        [pred aspect_hookSelector:NSSelectorFromString(@"_addRemoteView") withOptions:AspectPositionAfter usingBlock:^() {
            UIViewController *_remoteViewController = object_getIvar(pred, class_getInstanceVariable([pred class], "_remoteViewController"));
            
            [_remoteViewController aspect_hookSelector:@selector(viewDidLoad) withOptions:AspectPositionAfter usingBlock:^() {
                _remoteViewController.view.tintColor = wself.navigationController.navigationBar.tintColor;
            } error:NULL];
        } error:NULL];
        
        NSArray *ddActions = [pred valueForKeyPath:@"ddActions"];
        id openURLAction = [ddActions firstObject];
        
        [openURLAction aspect_hookSelector:NSSelectorFromString(@"perform") withOptions:AspectPositionInstead usingBlock:^ () {
            NSURL *_url = object_getIvar(openURLAction, class_getInstanceVariable([openURLAction class], "_url"));
            [wself loadURL:_url];
        } error:NULL];
        
        id _lookupItem = object_getIvar(_previewItemController, class_getInstanceVariable([_class class], "_lookupItem"));
        [_lookupItem aspect_hookSelector:NSSelectorFromString(@"commit") withOptions:AspectPositionInstead usingBlock:^() {
            NSURL *_url = object_getIvar(_lookupItem, class_getInstanceVariable([_lookupItem class], "_url"));
            [wself loadURL:_url];
        } error:NULL];
        [_lookupItem aspect_hookSelector:NSSelectorFromString(@"commitWithTransitionForPreviewViewController:inViewController:completion:") withOptions:AspectPositionInstead usingBlock:^() {
            NSURL *_url = object_getIvar(_lookupItem, class_getInstanceVariable([_lookupItem class], "_url"));
            [wself loadURL:_url];
        } error:NULL];
        /*
         UIWindow
         -UITransitionView
         --UIVisualEffectView
         ---_UIVisualEffectContentView
         ----UIView
         -----_UIPreviewActionSheetView
         */
        /*
         for (UIView * transitionView in [UIApplication sharedApplication].keyWindow.subviews) {
         if ([transitionView isMemberOfClass:NSClassFromString(@"UITransitionView")]) {
         transitionView.tintColor = wself.navigationController.navigationBar.tintColor;
         for (UIView *__view in transitionView.subviews) {
         if ([__view isMemberOfClass:NSClassFromString(@"UIVisualEffectView")]) {
         for (UIView *___view in __view.subviews) {
         if ([___view isMemberOfClass:NSClassFromString(@"_UIVisualEffectContentView")]) {
         for (UIView *____view in ___view.subviews) {
         if ([____view isMemberOfClass:NSClassFromString(@"UIView")]) {
         __weak typeof(____view) w____view = ____view;
         [____view aspect_hookSelector:@selector(addSubview:) withOptions:AspectPositionAfter usingBlock:^() {
         for (UIView *actionSheet in w____view.subviews) {
         if ([actionSheet isMemberOfClass:NSClassFromString(@"_UIPreviewActionSheetView")]) {
         break;
         }
         }
         } error:NULL];
         }
         }break;
         }
         }break;
         }
         }break;
         }
         }
         */
    } error:NULL];
    break;
    }
    }
}

致谢

RxWebViewController为我提供了思路,有些地方做了参考

iOS8.0以下使用了NJKWebViewProgress作为进度条,感谢!

更新日志

0.1.10

使用基于UIWebView的实现,进度条使用NJKWebViewProgress实现.

0.2.0

iOS8.0以上使用WKWebView实现,进度条使用UIProgressView实现. 实现了本页面Peek&Pop而不用跳转到Safari进行浏览.

0.3.0

使用AXNavigationBackItemInjection实现微信导航样式,也可以自定义返回的操作,只需要几行代码就可以搞定!

查看更多日志请移步Latest release.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].