(iOS - Objective-C) UItableView - 기본 응용 프로그램 내 코드 캡처 작업
본고는
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
의 부시도를 설정하면 크기가 UIScrollView
의 contentSize
의 크기라면 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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.