2017-01-29 10 views
7

Я хочу создать скриншот UIScrollView, который должен содержать весь контент прокрутки, даже тот контент, который в настоящее время не отображается пользователю. Для этого я попытался следующие два метода:Как сделать снимок экрана всего содержимого Scrollview?

func snapShot(view:UIView) -> UIImage { 
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, true, 0); 

    view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true); 

    let image = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    return image; 
} 

func snapShotScrollView(scrollView:UIScrollView) -> UIImage { 
    let bounds = scrollView.bounds; 

    scrollView.bounds.size = scrollView.contentSize; 

    let image = snapShot(scrollView); 

    scrollView.bounds = bounds; 

    return image; 
} 

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

Как я могу это сделать?

EDIT

Я также попытался:

func snapshot() -> UIImage? { 
    var image: UIImage? 

    UIGraphicsBeginImageContext(scrollView.contentSize) 

    let savedContentOffset = scrollView.contentOffset 
    let savedFrame = scrollView.frame; 

    scrollView.contentOffset = CGPoint.zero; 
    scrollView.frame = CGRect(x: 0, y: 0, width: scrollView.contentSize.width, height: scrollView.contentSize.height); 

    scrollView.layer.render(in: UIGraphicsGetCurrentContext()!) 
    image = UIGraphicsGetImageFromCurrentImageContext(); 

    scrollView.contentOffset = savedContentOffset; 
    scrollView.frame = savedFrame; 

    UIGraphicsEndImageContext(); 

    return image 
} 

Edit 2

Мой UIScrollView находится внутри UIView и не содержат UIStackView. Представление спроектировано как всплывающее представление, так что он выглядит как диалог появляется. Образец кода из моего первого редактирования работает в пробе UIViewController только с одним UIScrollView, но не в упомянутом созвездии.

+0

Я не думаю, что это легко, так как 'scrollView' просто рисует то, что ему нужно, и на самом деле не подходит для этого случая. – Alistra

+0

Возможно, полезно: http://stackoverflow.com/questions/3539717/getting-a-screenshot-of-a-uiscrollview-including-offscreen-parts – shallowThought

ответ

6

Для Swift из this answer, добавив тест ViewController:

class ScreenShotTestViewController: UIViewController { 

    var scrollView: UIScrollView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     scrollView = UIScrollView(frame: CGRect(origin: CGPoint.zero, size: view.frame.size)) 
     scrollView.contentSize = CGSize(width: view.frame.size.width, height: view.frame.size.height * 2) 
     scrollView.backgroundColor = UIColor.yellow 
     view.addSubview(scrollView) 

     let label = UILabel(frame: CGRect(x: 0.0, y: view.frame.size.height * 1.5, width: view.frame.size.width, height: 44.0)) 
     label.text = "Hello World!" 
     scrollView.addSubview(label) 

     let screenShot = snapshot() 
    } 

    func snapshot() -> UIImage? 
    {  
     UIGraphicsBeginImageContext(scrollView.contentSize) 

     let savedContentOffset = scrollView.contentOffset 
     let savedFrame = scrollView.frame 

     scrollView.contentOffset = CGPoint.zero 
     scrollView.frame = CGRect(x: 0, y: 0, width: scrollView.contentSize.width, height: scrollView.contentSize.height) 

     scrollView.layer.render(in: UIGraphicsGetCurrentContext()!) 
     let image = UIGraphicsGetImageFromCurrentImageContext() 

     scrollView.contentOffset = savedContentOffset 
     scrollView.frame = savedFrame 

     UIGraphicsEndImageContext() 

     return image 
    } 
} 

Результаты в образе полного содержания, в том числе подвидов:

+0

слишком плохо. Возможно, обновите свой вопрос тем, что вы уже пробовали. Вы пытались создать временное представление с размером содержимого scrollview? Как в [этом ответе] (http://stackoverflow.com/a/28343200/1457385)? – shallowThought

+0

Я добавил простой тест к моему ответу. Возможно, я ошибаюсь в отношении ожидаемого результата. – shallowThought

+0

Скопируйте мой весь ViewController и попробуйте, если это работает на вашей стороне, чтобы изолировать корень проблемы. Также покажите свой результат, чтобы понять, что именно идет не так. Является ли размер моментального снимка неправильным или не отображается в виде представлений, или ... – shallowThought

 Смежные вопросы

  • Нет связанных вопросов^_^