一、学习笔记

  • 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实现下拉刷新上拉加载
  • 只需要将UITableViewheaderfooter设置为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文件损坏
  • 报错信息
  • iOS开发 mjpeg iOs开发征信报告_iOS开发 mjpeg

  • 出现这个问题是因为我们的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