『ios』view和tableview的截圖和圖片拼接

weixin_34402408發表於2018-09-25
2440780-d4a5164711e41867.png
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;
    
}

這樣就完美解決問題。效果圖如下


2440780-10548ffe8748a40d.png
image.png

ios自習室歡迎進入,一起學習一起進步。

2440780-f71f74dca50574e3.JPG
IMG_7291.JPG

相關文章