IOS菜鸟初学第七篇:整理一些IOS开发中(基于wkwebview)可能用到的小技能,IOS12.2亲测可用

 

目录

 

获取/清空剪切板内容

本地保存数据操作

设置状态栏颜色/状态栏背景透明且页面填充背景

导航栏操作:修改背景颜色,是否显示,添加返回/关闭按钮

设置分栏控制器图标的位置和字体大小/颜色

WKWebview 禁止长按弹出菜单效果

WKWebview 禁止放大缩小

消息监听通知,可用于执行其他页面的刷新等操作

异步延迟操作

返回上一页操作

弹出系统提示框操作

字符串拼接操作

保存图片到相册

设置wkwebview上拉下拉背景颜色

获取当前显示的viewcontroller的名字

wkwebview运行/调用js代码

         解决WKWebView加载h5页面, 双击空白处页面上移

         存储数据到本地 

附录


 

 

获取/清空剪切板内容

//获取剪切板的内容
UIPasteboard *copyInfo = [UIPasteboard generalPasteboard];
NSString *copyData = copyInfo.string;

//清空剪切板,直接将剪切板的string赋值为空就好了
copyInfo.string = @"";

本地保存数据操作

// 初始化本地存储对象
NSUserDefaults *appInfo = [NSUserDefaults standardUserDefaults];

//设置关键词的值,取出时根据关键词取出对应的数据
[appInfo setObject:@"值" forKey:@"关键词"];

//取出的关键词赋值给变量以作它用
NSString *fc = [appInfo objectForKey:@"关键词"] 

设置状态栏颜色/状态栏背景透明且页面填充背景

// 修改状态栏背景颜色,这里我自定义颜色,如用白色可以写[UIColor whiteColor];
UIView *ssb = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];
if ([ssb respondsToSelector:@selector(setBackgroundColor:)]) {
    ssb.backgroundColor = [UIColor colorWithRed:28.0/255.0 green:127.0/255.0 blue:242.0/255.0 alpha:1.0];
}
self.webview.scrollView.backgroundColor = [UIColor colorWithRed:28.0/255.0 green:127.0/255.0 blue:242.0/255.0 alpha:1.0];


//修改状态透明,且页面向上填充
if (@available(iOS 11.0, *)) {
     self.webview.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
     self.edgesForExtendedLayout = UIRectEdgeNone;
}

导航栏操作:修改背景颜色,是否显示,添加返回/关闭按钮

//导航栏是否显示,YES-隐藏,NO-显示
self.navigationController.navigationBarHidden = YES;

//显示的导航栏添加左侧或右侧按钮
// 首先分两种情况
// 第一种,只需要在左边或者右边显示单个按钮,可以按照下面这样写:pressLeft和pressRight是点击
// 按钮触发的方法
UIBarButtonItem* leftBtn = [[UIBarButtonItem alloc] initWithTitle:@"QQ空间" style:UIBarButtonItemStyleDone target:self action:@selector(pressLeft)];
self.navigationItem.leftBarButtonItem = leftBtn;

//这里我初始化一个系统图标按钮,这里是相机图标,具体其他的可以查看附录
UIBarButtonItem* rightBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:self action:@selector(pressRight)];
self.navigationItem.rightBarButtonItem = rightBtn;

// 第二种 需要在同一侧显示两个及以上的按钮
// 有两种写法,第一种简单,第二种规范
// 第一种写法,基于上面改进
UIBarButtonItem* leftBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:self 
UIBarButtonItem* leftBtn2 = [[UIBarButtonItem alloc] initWithTitle:@"QQ空间" style:UIBarButtonItemStyleDone target:self action:@selector(pressLeft)];

//设置空白按钮区域,用于解决相邻按钮过于紧密
UIBarButtonItem *blankBtn= [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
//设置空白按钮宽度
blankBtn.width = 12;
// 最后,将这三个按钮一起添加到右侧
self.navigationItem.leftBarButtonItems = @[leftBtn,fixedSpaceBarButtonItem,rightBtn];

// 第二种规范写法,这里以wkwebview加载h5页面,需要在导航栏显示 返回按钮,关闭按钮。
// 作为示例
// 首先添加2个属性

@property (nonatomic, strong) UIBarButtonItem *backBarButtonItem;   //返回按钮
@property (nonatomic, strong) UIBarButtonItem *closeBarButtonItem;  //关闭按钮

// 然后写三个初始化方法
// 返回按钮 backImage是返回图标,back是返回触发事件
- (UIBarButtonItem *)backBarButtonItem {
    if (!_backBarButtonItem) {
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        [button setImage:[UIImage imageNamed:@"backImage"] forState:UIControlStateNormal];
        [button addTarget:self action:@selector(back:) forControlEvents:(UIControlEventTouchUpInside)];
        _backBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];
    }
    return _backBarButtonItem;
}

// 关闭按钮 close是关闭按钮触发的事件
- (UIBarButtonItem *)closeBarButtonItem {
    if (!_closeBarButtonItem) {
        _closeBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"关闭" style:UIBarButtonItemStylePlain target:self action:@selector(close:)];
    }
    return _closeBarButtonItem;
}

//最后在viewDidLoad中添加显示按钮
- (void)viewDidLoad {
    [super viewDidLoad];
    // 显示左边按钮,返回和关闭
    if ([self.webview canGoBack]) {
        self.navigationItem.leftBarButtonItems = @[self.backBarButtonItem,self.closeBarButtonItem];
    } else {
        self.navigationItem.leftBarButtonItem = self.backBarButtonItem;
    }
    // 显示右边重新加载按钮
    self.navigationItem.rightBarButtonItem = self.reloadBtn;
}

设置分栏控制器图标的位置和字体大小/颜色

由于这一部分涉及我之前写的文章,创建底部分栏控制器的相关代码,下面我会用到相关代码,不清楚我的代码哪里来的可以查看:https://blog.csdn.net/zhangtao0417/article/details/85627672

//首先,要明确一些细节。
//1.底部的分栏控制器控制器需要在AppDelegate中就初始化,可参考我上面的文章链接
//  虽在AppDelegate可以初始化一些属性,但是并不是所有属性都可以,例如字体大小,需要在自定的页面
//  进行二次设置,其实最好的办法就是在tabar所在的页面一次性初始化,而只是在AppDelegate中创建空
//  的tabar与指定页面进行绑定。
//  我在之前的文章中,在AppDelegate初始化的时候,写了如下代码:
vcFirst.title = @"首页";
vcSecond.title = @"搜索";
vcThird.title = @"个人";
// 上面的代码是用来设置顶部导航栏的title,但是有个不好的地方,就是,它也会被用来当作分栏控制器底
// 部的文字,如果需要不一致的话,就请你在tabar对应的view页面,设置UITabBarItem,参考下面我的
// 设置。
// 还有我在创建分栏控制器后,设置了分栏控制器的整体颜色,如果想在对应的页面也可修改。

//创建分栏控制器
UITabBarController* tbController = [[UITabBarController alloc] init];
//设置分栏控制器整体颜色(选中状态)
tbController.tabBar.tintColor = [UIColor colorWithRed:112.0/255.0 green:100.0/255.0 blue:225.0/255.0 alpha:1.0];


//好了,上面的部分是在AppDelegate中添加的,但是实际的需要在各自的页面设置一些不同的属性,比如图
//标等等
//好的,下面进入正式的tabbar设置

//初始化底部分栏器当前tab的title和图标
UITabBarItem* tbi = [[UITabBarItem alloc] initWithTitle:@"首页" image:nil tag:101];
//未被选择时显示的图标
tbi.image =[[UIImage imageNamed:@"WechatIMG4_11"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
//选择时显示的图标
tbi.selectedImage =[[UIImage imageNamed:@"WechatIMG4_12"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
//调整图标大小和位置(上,左,下,右)值可以正(增)负(减)
tbi.imageInsets = UIEdgeInsetsMake(-1, 0, 1, 0);
// 设置为选中状态的文字大小,颜色
// @"Helvetica"时默认字体,虽然可以修改为其他字体,但是并不其中用(亲测)
// size就是我们要的字体大小,后面[UIColor blueColor]就是文字的颜色,支持rgb自定义颜色。如下
// [UIColor colorWithRed:103.0/255.0 green:170.0/255.0 blue:239.0/255.0 alpha:1.0];
 [tbi setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIFont fontWithName:@"Helvetica" size:20], NSFontAttributeName,[UIColor blueColor],NSForegroundColorAttributeName,nil] forState:UIControlStateNormal];
// 设置为选中状态的文字大小,颜色
[tbi setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIFont fontWithName:@"Helvetica" size:20], NSFontAttributeName,[UIColor redColor],NSForegroundColorAttributeName,nil] forState:UIControlStateSelected];

self.tabBarItem = tbi;

WKWebview 禁止长按弹出菜单效果

//WKWebview 禁止长按(超链接、图片、文本...)弹出效果
WKWebViewConfiguration *wkcfg = [[WKWebViewConfiguration alloc] init];

[self.webview evaluateJavaScript:@"document.documentElement.style.webkitTouchCallout='none';" completionHandler:nil];
[self.webview evaluateJavaScript:@"document.documentElement.style.webkitUserSelect='none';"completionHandler:nil];
NSString *css =@"body{-webkit-user-select:none;-webkit-user-drag:none;}";
//css 选中样式取消
NSMutableString*javascript = [NSMutableString string];
[javascript appendString:@"var style = document.createElement('style');"];
[javascript appendString:@"style.type = 'text/css';"];
[javascript appendFormat:@"var cssContent = document.createTextNode('%@');", css];
[javascript appendString:@"style.appendChild(cssContent);"];
[javascript appendString:@"document.body.appendChild(style);"];
[javascript appendString:@"document.documentElement.style.webkitUserSelect='none';"];
[javascript appendString:@"document.documentElement.style.webkitTouchCallout='none';"];
WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:javascript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
[wkcfg.userContentController addUserScript:wkUScript];

WKWebview 禁止放大缩小

//禁止放大缩小
NSString *injectJs = @"var script = document.createElement('meta');"
        "script.name = 'viewport';"
        "script.content=\"width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no\";"
        "document.getElementsByTagName('head')[0].appendChild(script);";
[webView evaluateJavaScript:injectJs completionHandler:nil];

消息监听通知,可用于执行其他页面的刷新等操作

// 首先,在需要被通知的页面注册通知和通知执行方法
// 注册消息监听者
// notifyName是关键字,消息机制可根据关键字找到对应的通知地点
// listenerTodo 是监听到通知后执行的方法,这里就写收到通知后你的业务逻辑
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(listenerTodo:) name:@"notifyName" object:nil];

// listenerTodo方法,接受一个notification参数,这个参数在调用的时候传过来。
- (void)listenerTodo:(NSNotification *)notification {
    // 1.获取消息的数据参数
    NSString *searchword = notification.userInfo[@"key"];
    NSLog(@"key:%@",searchword);
    // 业务code...
}

// 在需要发起通知的下面执行下面的代码
//发起通知
// 我这里异步执行发送通知 info为我要传入的参数,key为关键字
dispatch_async(dispatch_get_main_queue(), ^{
   // 发送通知
   NSLog(@"在FirstVC发送通知,刷新页面");
   [[NSNotificationCenter defaultCenter] postNotificationName:NotificationName  object:nil userInfo:@{@"key":info}];
});

异步延迟操作

// dispatch_after 延迟执行
// dispatch_get_main_queue 异步执行
// 1 是设置延迟1秒
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
     NSLog(@"异步延迟");
     // 业务code   
});

返回上一页操作

// 返回两层
NSInteger index=[[self.navigationController viewControllers] indexOfObject:self];
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:index-2] animated:YES];

//返回一层
[self.navigationController popViewControllerAnimated:YES];
[self dismissViewControllerAnimated:NO completion:nil];

//额外说一个,跳转并关闭本层,vc为即将跳转的webview
NSArray *viewControlles = self.navigationController.viewControllers;
NSMutableArray *newviewControlles = [NSMutableArray array];
if ([viewControlles count] > 0) {
   for (int i=0; i < [viewControlles count]-1; i++) {
       [newviewControlles addObject:[viewControlles objectAtIndex:i]];
   }
}
[newviewControlles addObject:vc];
[self.navigationController setViewControllers:newviewControlles animated:YES];

弹出系统提示框操作

/**
 显示error框
 只有一个选项,确定,即提示完后确定无需再处理
 @param errorMsg <#errorMsg description#>
 */
- (void)showError:(NSString *)errorMsg {
    // 1.弹框提醒
    // 初始化对话框
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:errorMsg preferredStyle:UIAlertControllerStyleAlert];
    [alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil]];
    // 弹出对话框
    [self presentViewController:alert animated:true completion:nil];
}


/**
 常规选择提示框
 两个选项,一个确定,一个取消,都有对应的处理方法
 @param alertInfo 提示信息
 */
- (IBAction)showAlert:(NSDictionary *)alertInfo {
    //显示提示框
    UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"提示框title" message:alertInfo[@"msg"] preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
        //响应事件
        NSLog(@"action = %@", @"点击确认");
        
    }];
    UIAlertAction* cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
       //响应事件
       NSLog(@"action = %@", @"点击取消");
       }];
    
    [alert addAction:defaultAction];
    [alert addAction:cancelAction];
    [self presentViewController:alert animated:YES completion:nil];
}


//上面是定义的弹出框
// 下面是调用方法
// 第一种 showError
msg = @"保存图片失败" ;
[self showError:msg];

//第二种 showAlert,可以多参数,但是要注意两个@"",先是value后是key
NSDictionary *wxInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"检测到为安装微信,如需使用分享好友,请跳转到App Store中下载微信", @"msg",nil];
[self showAlert:wxInfo];

字符串拼接操作

NSString *pinstr = @"World";
NSString *str = [@"Hello " stringByAppendingFormat:@"%@",pinstr ];

保存图片到相册

// 首先在info.plist中添加好使用相册权限
NSPhotoLibraryUsageDescription

// 确认获取使用相册的权限之后
// 添加如下方法

/**
 base64转成img方法
 
 @param str 
 @return photo
 */
- (UIImage *)stringToImage:(NSString *)str {
    NSData * imageData =[[NSData alloc] initWithBase64EncodedString:str options:NSDataBase64DecodingIgnoreUnknownCharacters];
    UIImage *photo = [UIImage imageWithData:imageData ];
    return photo;
    
}


/**
 保存到系统相册的方法
 
 @param image <#image description#>
 @param completionTarget <#completionTarget description#>
 @param completionSelector <#completionSelector description#>
 @param comtextInfo <#comtextInfo description#>
 @return <#return value description#>
 */
UIKIT_EXTERN int UIImageWriteToSavePhotoaAlbum(UIImage *image,__nullable id completionTarget, __nullable SEL completionSelector,void * __nullable comtextInfo) __TVOS_PROHIBITED;

//保存后回调函数
-(void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
    NSString *msg = nil ;
    if(error){
        msg = @"保存图片失败" ;
        [self showError:msg];
    }else{
        msg = @"保存图片成功" ;
        [self showError:msg];
    }
}


// 调用方法如下:
// 参数shareimg 是base64字符串,格式如下
// data:image/png;base64,iVffkliweofnewffewklSHDkl....
// 需要将逗号之前的字符串截取掉
// stringToImage :base64的字符串转化成img图片方法

NSArray *array = [shareimg componentsSeparatedByString:@","];
NSString *basedata = array[1];
UIImage *image = [self stringToImage:basedata];
UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);


设置wkwebview上拉下拉背景颜色

// 当初我找了好久
// 后面发现wkwebview的背景颜色是由scrollView决定的,所以只需如下代码
self.showPage.scrollView.backgroundColor =[UIColor whiteColor];

获取当前显示的viewcontroller的名字

// 获取当前显示的页面是那个控制器的名字
UITabBarController *tbc = (UITabBarController *)self.window.rootViewController;
UINavigationController *nc = tbc.selectedViewController;
UIViewController *svc = nc.topViewController;

wkwebview运行/调用js代码

// 调用页面js中的setValue方法,参数为str
NSString *isInstallWX = [NSString stringWithFormat:@"setValue('%@')",str];
// 执行回调函数,判断是否执行成功
[webView evaluateJavaScript:isInstallWX completionHandler:^(id _Nullable item, NSError * _Nullable error) {
    NSLog(@"%@----%@",item, error);
}];

// iso获取加载的网页的title
//执行JS方法获取导航栏标题
[webView evaluateJavaScript:@"document.title" completionHandler:^(id _Nullable title, NSError * _Nullable error) {
    self.navigationItem.title = title;
}];

解决WKWebView加载h5页面, 双击空白处页面上移

self.edgesForExtendedLayout = UIRectEdgeBottom;

存储数据到本地 

//存储string类型到txt格式的文件
NSArray *pathArr=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *strPath=[pathArr lastObject];
NSString *strFinalPath=[NSString stringWithFormat:@"%@/myfile.txt",strPath];

NSString *strData=@"hello,baby!";
[strData writeToFile:strFinalPath atomically:YES encoding:NSUTF8StringEncoding error:nil];

//取出txt中的文件数据
NSString *readStr=[NSString alloc]initWithContentsOfFile:strFinalPath encoding:NSUTF8StringEncoding error:]
NSLog(@"%@", readStr);





// 存储array类型的数据到plist格式的文件
// 取得沙河中的路径
NSString *docPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
// 新增文件路径(在后续的操作中如发现没有,会自动创建)
NSString *dataPath = [docPath stringByAppendingPathComponent:@"data.plist"];
    
// 创建数据(生成的是plist文件,数据类型有所限制)
NSArray *data = @[
                  @{@"01": @"张三",
                  @"02": @"李四",
                  @"03": @"王五"},
                   @[@1,
                     @2,
                     @3]
                   ];
// 文件写入
[data writeToFile:dataPath atomically:YES];


//取出plist文件中的数据
// 取得沙河中的路径(直接拼接)
NSString *dataPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/data.plist"];
    
// 取得数据
NSArray *data = [NSArray arrayWithContentsOfFile:dataPath];
NSLog(@"%@", data);

附录

1.IOS系统按钮自带样式

按钮标识符

描    述

UIBarButtonSystemItemDone

蓝色文字按钮,标有“Done”

UIBarButtonSystemItemCancel

文字按钮,标有“Cancel”

UIBarButtonSystemItemEdit

文字按钮,标有“Edit”

UIBarButtonSystemItemSave

蓝色文字按钮,标有“Save”

UIBarButtonSystemItemAdd

图像按钮,上面有一个Å符号

UIBarButtonSystemItemFlexibleSpace

空白,占用空间大小可变

UIBarButtonSystemItemFixedSpace

空白占位符

UIBarButtonSystemItemCompose

图像按钮,上有一支笔和纸张

UIBarButtonSystemItemReply

图像按钮,上有一个回复箭头

UIBarButtonSystemItemAction

图像按钮,上有一个动作箭头

UIBarButtonSystemItemOrganize

图像按钮,上有一个文件夹以及向下箭头

UIBarButtonSystemItemBookmarks

图像按钮,上有书签图标

UIBarButtonSystemItemSearch

图像按钮,上有spotlight图标

UIBarButtonSystemItemRefresh

图像按钮,上有一个环形的刷新箭头

UIBarButtonSystemItemStop

图像按钮,上有一个停止记号X

UIBarButtonSystemItemCamera

图像按钮,上有一个照相机

UIBarButtonSystemItemTrash

图像按钮,上有一个垃圾桶

UIBarButtonSystemItemPlay

图像按钮,上有一个播放图标

UIBarButtonSystemItemPause

图像按钮,上有一个暂停图标

UIBarButtonSystemItemRewind

图像按钮,上有一个倒带图标

UIBarButtonSystemItemFastForward

图像按钮,上有一个快进图标

发布了65 篇原创文章 · 获赞 31 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/zhangtao0417/article/details/89957534