一、学习笔记
urlencode:
urlencode编码主要是用来解决url中出现中文或者特殊字符在网络传输过程中出现乱码的问题- 首先要定义要转义的字符集合,可以自定义也可以使用默认的,然后再调用
stringByAddingPercentEncodingWithAllowedCharacters方法转义
// 默认字符集
NSCharacterSet *set= [NSCharacterSet URLUserAllowedCharacterSet];
// 自定义字符集
NSString *charaters = @"?!@#$^&%*+,:;='\"`<>()[]{}/\\| ";
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
- https://www.jianshu.com/p/7ec6b0a47a4d
- .xcodeproj文件损坏
- https://www.jianshu.com/p/a0762b67e657
- UILabel设置行距
- https://www.jianshu.com/p/badee2350860
- WKWebView修改html图片尺寸和字体大小
- https://www.jianshu.com/p/252201b77ac3
- MJRefresh
- https://www.jianshu.com/p/df1f1f265c33
- https://www.jianshu.com/p/e4ff42e6894c
- 下滑列表自动加载
- https://www.jianshu.com/p/55c0f5b5670f
















