2016-05-05 7 views
1

Мой код Swift для захвата UITableView как изображения не работает, когда таблица прокручивается вниз. Я по существу имею ответ в Objective-C, но не могу заставить его работать в Swift. В настоящее время это то, что я имею в Swift:Capture UITableView как изображение - с прокруткой

func snapshotOfCell (inputView: UIView) -> UIView { 
    UIGraphicsBeginImageContextWithOptions(inputView.bounds.size, false, 0.0) 
    inputView.layer.renderInContext(UIGraphicsGetCurrentContext()!) 
    let image = UIGraphicsGetImageFromCurrentImageContext() as UIImage 
    UIGraphicsEndImageContext() 
    let cellSnapshot : UIView = UIImageView(image: image) 
    cellSnapshot.layer.masksToBounds = false 

    return cellSnapshot 
} 

Я нашел this ответ, но это в Objective-C:

-(UIImage *) imageWithTableView:(UITableView *)tableView { 
    UIView *renderedView = tableView; 
    CGPoint tableContentOffset = tableView.contentOffset; 
    UIGraphicsBeginImageContextWithOptions(renderedView.bounds.size, renderedView.opaque, 0.0); 
    CGContextRef contextRef = UIGraphicsGetCurrentContext(); 
    CGContextTranslateCTM(contextRef, 0, -tableContentOffset.y); 
    [tableView.layer renderInContext:contextRef]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return image; 
} 

Кажется, чтобы решить эту проблему прокрутки с помощью contentOffset. Тем не менее, я пытаюсь интегрировать его в мою функцию Swift без успеха. Кто-нибудь хорошо с Objective-C и Swift? Благодаря!

ответ

2

захвата всей TableView как изображение

UIGraphicsBeginImageContextWithOptions(CGSizeMake(tableView.contentSize.width, tableView.contentSize.height),false, 0.0) 

    let context = UIGraphicsGetCurrentContext() 

    let previousFrame = tableView.frame 

    tableView.frame = CGRectMake(tableView.frame.origin.x, tableView.frame.origin.y, tableView.contentSize.width, tableView.contentSize.height); 

    tableView.layer.renderInContext(context!) 

    tableView.frame = previousFrame 

    let image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext(); 

    imageView.image = image; 

захват скриншота Tableview в прокручивать положении

let contentOffset = tableView.contentOffset 

    UIGraphicsBeginImageContextWithOptions(tableView.bounds.size, true, 1) 

    let context = UIGraphicsGetCurrentContext() 

    CGContextTranslateCTM(context, 0, -contentOffset.y) 

    tableView.layer.renderInContext(context!) 

    let image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    imageView.image = image; 
+0

Пробовал это без везения. Он работает как мой код Swift. Когда таблица не была прокручена, она работает хорошо, но она не фиксирует прокручиваемую таблицу правильно. –

+0

Вы хотите, чтобы снимок экрана tabview после прокрутки в какой-то позиции? – Jeyamahesan

+0

Да, извините, если я не прояснил это. Когда я прокручиваю вниз на полпути, а затем запускаю код, на картинке в настоящее время появляется много белого пробела, и это неверно. Я хочу, чтобы изображение отражало то, что на экране –

0

Попробуйте этот кусок кода:

-(UIImage *)screenshot { 
UIImage *image = nil; 

UIGraphicsBeginImageContextWithOptions(tableView.contentSize, false, 0.0); 
{ 
    CGPoint savedContentOffset = tableView.contentOffset; 
    CGRect savedFrame = tableView.frame; 

    tableView.contentOffset = CGPointMake(0.0, 0.0); 
    tableView.frame = CGRectMake(0, 0.0, tableView.contentSize.width, tableView.contentSize.height); 

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

    tableView.contentOffset = savedContentOffset; 
    tableView.frame = savedFrame; 
} 
UIGraphicsEndImageContext(); 

return image; 
} 

Днем Coding .. !!

+0

Спасибо, теперь за дверь, но попробуем сегодня вечером. Не эти первые две строки в Objective-C? –

+0

Просто попробуйте. Он проверен на прокрутку, и я надеюсь, что это сработает и для вас. Весь код написан в Objective-C. –

0

Пожалуйста, попробуйте это Его может помочь вам

- (UIImage*)buildImage:(UIImage*)image 
{ 
    UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale); 

    [image drawAtPoint:CGPointZero]; 


    CGFloat scale; 

    scale = image.size.width/_workingView.frame.size.width; 



     CGContextScaleCTM(UIGraphicsGetCurrentContext(), scale, scale); 

    NSLog(@"%f",scale); 


    [tableView.layer renderInContext:UIGraphicsGetCurrentContext()]; 

    UIImage *tmp = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    return tmp; 
} 
1

Swift 3.0 для захвата всего табличного представления на основе ответа @ Jeyamahesan

UIGraphicsBeginImageContextWithOptions(CGSize(width:tableView.contentSize.width, height:tableView.contentSize.height),false, 0.0) 
let context = UIGraphicsGetCurrentContext() 
let previousFrame = tableView.frame 
tableView.frame = CGRect(x: tableView.frame.origin.x, y: tableView.frame.origin.y, width: tableView.contentSize.width, height: tableView.contentSize.height) 
tableView.layer.render(in: context!) 
tableView.frame = previousFrame 
let image = UIGraphicsGetImageFromCurrentImageContext()! 
UIGraphicsEndImageContext()