iOS 开发实训第十一周周报
一、学习笔记
-
urlencode
:-
urlencode
编码主要是用来解决url
中出现中文或者特殊字符在网络传输过程中出现乱码的问题 -
首先要定义要转义的字符集合,可以自定义也可以使用默认的,然后再调用
stringByAddingPercentEncodingWithAllowedCharacters
方法转义// 默认字符集 NSCharacterSet *set= [NSCharacterSet URLUserAllowedCharacterSet]; // 自定义字符集 NSString *charaters = @"aaa@qq.com#$^&%*+,:;='\"`<>()[]{}/\\| "; NSCharacterSet *set = [[NSCharacterSet characterSetWithCharactersInString:charaters] invertedSet]; NSString *encodedUrl = [url stringByAddingPercentEncodingWithAllowedCharacters:set];
-
-
UILabel
设置行距和字间距-
需要使用富文本,通过修改富文本的属性实现
// 富文本属性 NSMutableDictionary *attrDict = [NSMutableDictionary dictionary]; // 字体颜色 attrDict[NSForegroundColorAttributeName] = [UIColor blackColor]; // 字号大小 attrDict[NSFontAttributeName] = [UIFont systemFontOfSize:16.0]; // 段落样式 NSMutableParagraphStyle *paraStyle = [[NSMutableParagraphStyle alloc] init]; paraStyle.lineSpacing = 10.0; // 行间距 paraStyle.firstLineHeadIndent = 20.0; // 首行文本缩进 attrDict[NSParagraphStyleAttributeName] = paraStyle; // 应用文本段落样式 // 字间距(字符串) attrDict[NSKernAttributeName] = @(1); // 给Label设置富文本 testLabel.attributedText = [[NSAttributedString alloc] initWithString:text attributes:attrDict];
-
-
使用第三方库
MJRefresh
实现下拉刷新上拉加载-
只需要将
UITableView
的header
和footer
设置为MJRefresh
里定义的类型,然后设置其回调函数即可 -
实例:
- (void)viewDidLoad { [super viewDidLoad]; [self addSubViews]; // 集成下拉刷新控件 [self setupDownRefresh]; // 集成上拉刷新控件 [self setupUpRefresh]; } - (void)setupUpRefresh { self.newsTableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)]; } - (void)setupDownRefresh { self.newsTableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)]; [self.newsTableView.mj_header beginRefreshing]; // 第一次加载 } - (void)loadNewData { NSLog(@"loadNewData"); FirstPageViewModel *viewModel = [[FirstPageViewModel alloc] init]; [viewModel getFeedsListWithOffset:self.offset success:^(NSMutableArray * _Nonnull dataArray) { // 返回的数据插入在前面 NSRange range = NSMakeRange(0, 20); NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:range]; [self.tableDataArray insertObjects:dataArray atIndexes:indexSet]; dispatch_async(dispatch_get_main_queue(), ^{ [self.newsTableView reloadData]; [self.newsTableView.mj_header endRefreshing]; self.offset = self.offset + 20; NSLog(@"reload tableview"); }); } failure:^(NSError * _Nonnull error) { NSLog(@"请求失败 error:%@",error.description); [self.newsTableView.mj_header endRefreshing]; }]; } - (void)loadMoreData { NSLog(@"loadMoreData"); FirstPageViewModel *viewModel = [[FirstPageViewModel alloc] init]; [viewModel getFeedsListWithOffset:self.offset success:^(NSMutableArray * _Nonnull dataArray) { // 返回的数据插入到后面 [self.tableDataArray addObjectsFromArray:dataArray]; dispatch_async(dispatch_get_main_queue(), ^{ [self.newsTableView reloadData]; [self.newsTableView.mj_footer endRefreshing]; self.offset = self.offset + 20; NSLog(@"reload tableview"); }); } failure:^(NSError * _Nonnull error) { NSLog(@"请求失败 error:%@",error.description); [self.newsTableView.mj_footer endRefreshing]; }]; }
-
-
自动加载:
-
希望实现在上滑阅读的时候,显示到已加载的最后几条时就自动加载一次,实现较为平滑的效果
-
我实现的方法是在
UITableView
的代理方法willDisplay
中判断将要加载的Cell
是否等于data.count - 5
,等于的时候就主动调用一次加载数据的方法- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.row == self.tableDataArray.count - 5 && self.isLoading == NO) { // isLoading是为了避免和上拉加载下拉刷新冲突 [self loadMoreData]; } }
-
二、遇到的问题及解决方法
-
.xcodeproj
文件损坏-
报错信息
-
出现这个问题是因为我们的
github
中没有加.gitignore
文件,没有屏蔽.xcuserdata
,当我从主分支拉代码到自己的分支后,和其他人的.xcodeproj
文件冲突了,和其他部分的代码一样,会在冲突的地方加上<<<< HEAD ... ==== ... <<<<
作为提示,导致.xcodeproj
文件无法解析,所以打不开 -
解决的方法就是用文本的格式打开
.xcodeproj
文件,然后解决冲突
-
-
WKWebView
设置图片宽度适应屏幕-
网上绝大部分的解决方案都是在
WKWebView
的代理方法didFinishNavigation
中调用JS
代码来设置图片宽度,但是对我是无效的- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{ [ webView evaluateJavaScript:@"document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= '300%'" completionHandler:nil]; [ webView evaluateJavaScript:@"var script = document.createElement('script');" "script.type = 'text/javascript';" "script.text = \"function ResizeImages() { " "var myimg,oldwidth;" "var maxwidth = 300.0;" // UIWebView中显示的图片宽度 "for(i=1;i <document.images.length;i++){" "myimg = document.images[i];" "oldwidth = myimg.width;" "myimg.width = maxwidth;" "}" "}\";" "document.getElementsByTagName('head')[0].appendChild(script);ResizeImages();" completionHandler:nil]; }
运行时发现文字大小的设置是有效的,但是对图片的设置没用,也在一个问答网站里看到有人遇到了同样的问题,在下面的回答里有一种说法是需要再次加载才可以控制图片,但是没有解释清楚
-
另一种解决方法为将原始的htmlString进行封装,将
JS
代码加到htmlString里,就不需要调用WKWebView
的代理方法,这个方法对我是有效的NSString *htmls = [NSString stringWithFormat:@"<html> \n" "<head> \n" "<style type=\"text/css\"> \n" "body {font-size:15px;}\n" "</style> \n" "</head> \n" "<body>" "<script type='text/javascript'>" "window.onload = function(){\n" "var $img = document.getElementsByTagName('img');\n" "for(var p in $img){\n" " $img[p].style.width = '100%%';\n" "$img[p].style.height ='auto'\n" "}\n" "}" "</script>%@" "</body>" "</html>", htmlString];
-
三、参考链接
- urlencode
- .xcodeproj文件损坏
- UILabel设置行距
- WKWebView修改html图片尺寸和字体大小
- MJRefresh
- 下滑列表自动加载
上一篇: 一个在 iOS 设备屏幕上实时打印 Log 的小工具
下一篇: iOS-父子控制器