IOS實現長圖截取

總結一下最近遇到的功能開發。

因爲IOS自帶的截圖並不能截取長圖,所以爲了更好的用戶體驗,我們需要開發對應的功能。

- (UIImage *)screenShotWithSize:(CGSize )size {
    UIImage* image = nil;
    /*
     *UIGraphicsBeginImageContextWithOptions有三個參數
     *size    bitmap上下文的大小,就是生成圖片的size
     *opaque  是否不透明,當指定爲YES的時候圖片的質量會比較好
     *scale   縮放比例,指定爲0.0表示使用手機主屏幕的縮放比例
     */
    UIGraphicsBeginImageContextWithOptions(size, YES, [UIScreen mainScreen].scale);
    //保存tableView當前的偏移量
    CGPoint savedContentOffset = self.tableView.contentOffset;
    CGRect saveFrame = self.tableView.frame;
    CGRect saveViewFrame = self.view.frame;
    
    //將tableView的偏移量設置爲(0,0)
    self.tableView.contentOffset = CGPointZero;
    self.tableView.frame = CGRectMake(0, saveFrame.origin.y, self.tableView.contentSize.width, self.tableView.contentSize.height);
    self.view.frame = CGRectMake(0, 0, size.width,size.height);
    //在當前上下文中渲染出tableView
    [self.view.layer renderInContext: UIGraphicsGetCurrentContext()];
    //截取當前上下文生成Image
    image = UIGraphicsGetImageFromCurrentImageContext();
    
    UIGraphicsEndImageContext();
    
    //恢復tableView的偏移量
    self.tableView.frame = saveFrame;
    [self.tableView setContentOffset:savedContentOffset animated:NO];
    self.view.frame = saveViewFrame;
    
    
    if (image != nil) {
        return image;
    }else {
        return nil;
    }
}

以view作爲容器,在截圖前後通過變換view和tableView的高度,實現長截圖功能。同理,也可以根據該方法,實現collectionView和scrollView的全截圖。至於後續是保存本地還是分享到三方平臺,這個就需要各位看官自己去實現了。

PS:這個方法有些時候會造成截圖不完整,經過調查發現,是因爲沒有關閉self-sizing,這個時候就需要下方的代碼了。

//關閉self-sizing
_tableView.estimatedRowHeight = 0;
_tableView.estimatedSectionHeaderHeight = 0;
_tableView.estimatedSectionFooterHeight = 0;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章