欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

iOS 开发实训第十一周周报

程序员文章站 2022-03-06 17:38:09
...

一、学习笔记

  • 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实现下拉刷新上拉加载

    • 只需要将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 开发实训第十一周周报

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

三、参考链接

相关标签: iOS