UITableView截取列表长图并使用原生分享

2023-06-06  本文已影响0人  此笙吥涣

最近项目有个需求,简历功能是个列表,需要截图并通过原生分享出去,简单的记录一下解决方案。话不多说,直接上代码,如有问题欢迎指正。

注意:此方法需要在第一次渲染页面时调用一次,截图操作时再调用一次,防止cell服用截图缺失

- (UIImage*)captureImageLonge:(UITableView*)shotTableView{
    
    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]){
        
        UIGraphicsBeginImageContextWithOptions(self.makeTableView.contentSize, NO, [UIScreen mainScreen].scale);
    }else{
       
        UIGraphicsBeginImageContext(self.makeTableView.contentSize);
    }
    //先保存原来frame 和 偏移量
    CGPoint savedContentOffset =self.makeTableView.contentOffset;
    CGRect savedFrame =self.makeTableView.frame;
    CGSize contentSize =self.makeTableView.contentSize;
    CGRect oldBounds =self.makeTableView.layer.bounds;
    if(@available(iOS 13.0, *)){
        //iOS 13 系统截屏需要改变tableview 的bounds
        [self.makeTableView.layer setBounds:CGRectMake(oldBounds.origin.x, oldBounds.origin.y, contentSize.width, contentSize.height+20)];
    }
    //偏移量归零
    self.makeTableView.contentOffset = CGPointZero;
    self.makeTableView.frame = CGRectMake(0, 0, self.makeTableView.contentSize.width, self.makeTableView.contentSize.height+20);
    //截图
    [self.makeTableView.layer renderInContext:UIGraphicsGetCurrentContext()];
    
    if(@available(iOS 13.0,*)){
       
        [self.makeTableView.layer setBounds:oldBounds];
    }
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    //还原frame 和 偏移量
//    self.tableView.contentOffset = savedContentOffset;
    self.makeTableView.frame= savedFrame;
    self.makeTableView.contentOffset= savedContentOffset;

    return image;
}

使用原生分享

- (void) shareRemuse {
    
    [self captureImageLonge:self.makeTableView];
    
    NSMutableArray *images = [NSMutableArray array];
    [images addObject:[self captureImageLonge:self.makeTableView]];
    UIActivityViewController *activityController=[[UIActivityViewController alloc]initWithActivityItems:images applicationActivities:nil];
    [self.navigationController presentViewController:activityController animated:YES completion:nil];
    
}
上一篇下一篇

猜你喜欢

热点阅读