目录
获取/清空剪切板内容
本地保存数据操作
设置状态栏颜色/状态栏背景透明且页面填充背景
导航栏操作:修改背景颜色,是否显示,添加返回/关闭按钮
设置分栏控制器图标的位置和字体大小/颜色
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 禁止长按(超链接、图片、文本...)弹出效果
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];
//禁止放大缩小
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的背景颜色是由scrollView决定的,所以只需如下代码
self.showPage.scrollView.backgroundColor =[UIColor whiteColor];
// 获取当前显示的页面是那个控制器的名字
UITabBarController *tbc = (UITabBarController *)self.window.rootViewController;
UINavigationController *nc = tbc.selectedViewController;
UIViewController *svc = nc.topViewController;
// 调用页面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;
}];
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 |
图像按钮,上有一个快进图标 |