(iOS - Objective-C) UItableView - 기본 응용 프로그램 내 코드 캡처 작업

6491 단어
2018.9.19
본고는 UIView,UIScrollView,UITableView 세 가지 자주 사용하는 보기의 코드 캡처 방법을 제공했다. 이 세 가지 사고방식은 모두 같다. 모든 디스플레이 내용을 하나의 상하문 대상에 과장한 다음에 이 상하문 대상을 UIImage 대상으로 저장하면 OK이다.
UIView 캡처
상하문 대상을 간단하게 설정하고 몇 마디의 코드를 호출하면 된다. 관건은 UIView의 크기와 비례계수(선명도에 영향을 줍니까?)를 설정하는 데 있다.편리하게 UIImage의 분류에 쓰는 것을 권장합니다.
+ (UIImage *)CapturedWithUIView:(UIView *)view {
    //     ,           。              。           ,   NO,   YES。            ,         。
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, [UIScreen mainScreen].scale);

    [view.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

UIScrollView 캡처
사실 방법은 UIView의 캡처 방법과 기본적으로 차이가 없다. 만약에 UIView의 부시도를 설정하면 크기가 UIScrollViewcontentSize의 크기라면 UIView의 캡처 방법도 문제없을 것이다.편리하게 UIImage의 분류에 쓰는 것을 권장합니다.
+ (UIImage *)CapturedWithUIScrollView:(UIScrollView *)scrollView {
    UIImage* image = nil;
    UIGraphicsBeginImageContextWithOptions(scrollView.contentSize, NO, [UIScreen mainScreen].scale);
    {
        CGPoint savedContentOffset = scrollView.contentOffset;
        CGRect savedFrame =  scrollView.frame;

        scrollView.contentOffset = CGPointZero;
        scrollView.frame = CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height);

        [scrollView.layer renderInContext:UIGraphicsGetCurrentContext()];
        image = UIGraphicsGetImageFromCurrentImageContext();

        scrollView.contentOffset = savedContentOffset;
        scrollView.frame = savedFrame;
    }
    UIGraphicsEndImageContext();
    return image;
}

UItableView 캡처
이곳이 좀 번거로운 것은 Cell이 중용될 수 있다는 것이다. 즉, 위의 방법이 적용될 수 없다는 것이다. 왜냐하면 Cell의 내용이 상하문 대상에 그려지지 않았기 때문에 당연히 캡처할 수 없기 때문이다.처리 사고방식 역시 모든 보기를 상하문 대상에 렌더링한 다음에 상하문 대상을 UIImage 실례로 바꾸는 것이다.쉽게 UIImage의 분류에 쓰기를 권장합니다.이것은 나의 최종 실현 방법이 비교적 거칠다. 만약에 어떤 원숭이 형이 더 좋은 처리 방식을 가지고 있다면 아낌없이 가르침을 청한다.참고: 1. - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section , , UITableViewHeaderFooterView , , headerViewForSection footerViewForSection ; 2. QQ , TableView, , ; 참조: UItableView screenshot
+ (UIImage *)CapturedWithUITableView:(UITableView *)tableView {
    CGPoint savedContentOffset = tableView.contentOffset;
    ///          
    CGFloat contentHeight = 0;
    if (tableView.tableHeaderView)
        contentHeight += tableView.tableHeaderView.frame.size.height;
    {
        NSInteger sections = tableView.numberOfSections;
        for (NSInteger i = 0; i < sections; i++) {
            contentHeight += [tableView rectForHeaderInSection:i].size.height;

            NSInteger rows = [tableView numberOfRowsInSection:i];
            {
                for (NSInteger j = 0; j < rows; j++) {
                    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:j inSection:i];
                    [tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionNone animated:NO];
                    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
                    contentHeight += cell.frame.size.height;
                }
            }

            contentHeight += [tableView rectForFooterInSection:i].size.height;
        }
    }
    if (tableView.tableFooterView)
        contentHeight += tableView.tableFooterView.frame.size.height;

    ///    
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(tableView.frame.size.width, contentHeight), NO, [UIScreen mainScreen].scale);
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    ///       render CGContext 
    if (tableView.tableHeaderView) {
        contentHeight = tableView.tableHeaderView.frame.size.height;
        tableView.contentOffset = CGPointMake(0, contentHeight);
        [tableView.tableHeaderView.layer renderInContext:ctx];
        CGContextTranslateCTM(ctx, 0, tableView.tableHeaderView.frame.size.height);
    }

    NSInteger sections = tableView.numberOfSections;
    for (NSInteger i = 0; i < sections; i++) {
        ///sectionHeader
        contentHeight += [tableView rectForHeaderInSection:i].size.height;
        tableView.contentOffset = CGPointMake(0, contentHeight);
        UIView *headerView = [tableView headerViewForSection:i];
        if (headerView) {
            [headerView.layer renderInContext:ctx];
            CGContextTranslateCTM(ctx, 0, headerView.frame.size.height);
        }
        ///Cell
        NSInteger rows = [tableView numberOfRowsInSection:i];
        {
            for (NSInteger j = 0; j < rows; j++) {
                //  cell       tableView ,      CGContext    render  
                NSIndexPath *indexPath = [NSIndexPath indexPathForRow:j inSection:i];
                [tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionNone animated:NO];
                UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
                contentHeight += cell.frame.size.height;
                [cell.layer renderInContext:ctx];
                CGContextTranslateCTM(ctx, 0, cell.frame.size.height);
            }
        }
        ///sectionFooter
        contentHeight += [tableView rectForFooterInSection:i].size.height;
        tableView.contentOffset = CGPointMake(0, contentHeight);
        UIView *footerView = [tableView footerViewForSection:i];
        if (footerView) {
            [footerView.layer renderInContext:ctx];
            CGContextTranslateCTM(ctx, 0, footerView.frame.size.height);
        }
    }

    if (tableView.tableFooterView) {
        tableView.contentOffset = CGPointMake(0, tableView.contentSize.height-tableView.frame.size.height);
        [tableView.tableFooterView.layer renderInContext:ctx];
        //CGContextTranslateCTM(ctx, 0, tableView.tableFooterView.frame.size.height);
    }

    ///  UIImage  
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    tableView.contentOffset = savedContentOffset;
    return image;
}

좋은 웹페이지 즐겨찾기