『ios』进阶

『ios』view和tableview的截屏和图片拼接

2018-09-25  本文已影响29人  butterflyer
image.png

项目中有这么个需求,截取当前屏幕并拼接上公司的二维码。说下解决思路。
首先上面的图片肯定不符合我的需求

-(UIImage *)screenShotFromView:(UIView *)view{
    
    UIGraphicsBeginImageContextWithOptions(view.frame.size,NO, 0);
    
    [[UIColor clearColor] setFill];
    
    [[UIBezierPath bezierPathWithRect:view.bounds] fill];
    
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    [view.layer renderInContext:ctx];
    
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    
    UIGraphicsEndImageContext();
    
    return image;}

这是方法。有句话叫做需求驱动开发。请往下看。
我现在的需求是截取整个tableview,所以我现在需要当前画布的大小要是tableview的contentsize。也就是说tableview.frame就是当前tableview的contentsize.
所以看下面的方法就明白什么意思了。

   UIImage* image = nil;
    
    [self.tableView reloadData];
    [self.tableView layoutIfNeeded];
    
    UIGraphicsBeginImageContextWithOptions(self.tableView.contentSize, YES, 0.0);
    //保存collectionView当前的偏移量
    CGPoint savedContentOffset = self.tableView.contentOffset;
    CGRect saveFrame = self.tableView.frame;
    //将collectionView的偏移量设置为(0,0)
    self.tableView.contentOffset = CGPointZero;
    
    self.tableView.frame = CGRectMake(0, 0, self.tableView.contentSize.width, self.tableView.contentSize.height);
    
    [self.tableView reloadData];
    [self.tableView layoutIfNeeded];
    
    self.tableView.frame = CGRectMake(0, 0, self.tableView.contentSize.width, self.tableView.contentSize.height);
    
//    LDLog(@"%@----",NSStringFromCGRect(self.tableView.frame));
    //在当前上下文中渲染出collectionView
    [self.tableView.layer renderInContext:UIGraphicsGetCurrentContext()];
    
    //截取当前上下文生成Image
    image = UIGraphicsGetImageFromCurrentImageContext();
    
    //恢复collectionView的偏移量
    self.tableView.contentOffset = savedContentOffset;
    self.tableView.frame = saveFrame;
    UIGraphicsEndImageContext();
    
    if (image != nil) {
        return image;
    }else {
        return nil;
    }

至于图片的拼接。

- (UIImage *)addHead:(UIImage *)headImage foot:(UIImage *)footImage toMaster:(UIImage *)masterImage {
    
    CGSize size;
    size.width = masterImage.size.width;
    
    CGFloat headHeight = !headImage? 0:headImage.size.height;
    CGFloat footHeight = !footImage? 0:footImage.size.height;
    
    size.height = masterImage.size.height + headHeight + footHeight;
    
    UIGraphicsBeginImageContextWithOptions(size, YES, 0.0);
    
    if (headImage)
        [headImage drawInRect:CGRectMake(0, 0, masterImage.size.width, headHeight)];
    
    [masterImage drawInRect:CGRectMake(0, headHeight, masterImage.size.width, masterImage.size.height)];
    
    if (footImage)
        [footImage drawInRect:CGRectMake(0, masterImage.size.height + headHeight, masterImage.size.width, footHeight)];
    
    UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();
    
    UIGraphicsEndImageContext();
    return resultImage;
    
}

这样就完美解决问题。效果图如下


image.png

ios自习室欢迎进入,一起学习一起进步。

IMG_7291.JPG
上一篇下一篇

猜你喜欢

热点阅读