更新发生后创建屏幕截图? - iOS

时间:2016-01-23 04:45:55

标签: ios swift image uiview screenshot

我有一个ScrollView,里面有很多视图。有些观点是隐藏的。如果未隐藏这些视图,ScrollView将展开。如果未隐藏所有视图,则ScrollView的大小会扩大,并且大于屏幕的高度。因此,您需要滚动才能看到所有内容。

我想做的是拍摄整个屏幕的图片,每个视图都没有隐藏。所以,假设一个视图被隐藏,然后我将以编程方式取消隐藏视图然后拍照。 我不希望用户能够看到屏幕展开然后折叠。

这是我到目前为止所拥有的。只有在调用此函数之前视图尚未隐藏时,它才有效。问题是如果我在隐藏视图时尝试调用此函数,那么它只会拍摄当前屏幕/可见内容的图片,它不会捕获屏幕外的所有内容/不可见。

  func createImageFromEntireScreen() -> UIImage {

    print("Beginning: \(scrollView.contentSize)")

    UIGraphicsBeginImageContextWithOptions(scrollView.contentSize, scrollView.opaque, 0.0)

    print("Middle: \(scrollView.contentSize)")

    let savedContentOffset: CGPoint = scrollView.contentOffset
    let savedFrame: CGRect = scrollView.frame

    let savedIdeaSummaryStackViewHiddenValue = ideaSummaryStackView.hidden.boolValue
    let savedAllQuestionsCombinedStackView = allQuestionsCombinedStackView.hidden.boolValue
    let savedNotesStackView = notesStackView.hidden.boolValue

    // THIS IS THE PROBLEM. If these views were already unhidden 
    // before the screenshot, then its OK. But if I hide them in
    // here then it only takes a picture of what is on screen.
    // The reason I unhide it here is so the user doesn't see this happening.
    ideaSummaryStackView.hidden = false
    ideaSummaryStackView.alpha = 1.0
    allQuestionsCombinedStackView.hidden = false
    allQuestionsCombinedStackView.alpha = 1.0
    notesStackView.hidden = false
    notesStackView.alpha = 1.0

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

    print("Ending: \(scrollView.contentSize)")

    scrollView.layer.renderInContext(UIGraphicsGetCurrentContext()!)
    let createdImage = UIGraphicsGetImageFromCurrentImageContext()

    // ----- Revert to original screen: Begin
    ideaSummaryStackView.hidden = savedIdeaSummaryStackViewHiddenValue
    allQuestionsCombinedStackView.hidden = savedAllQuestionsCombinedStackView
    notesStackView.hidden = savedNotesStackView

    scrollView.contentOffset = savedContentOffset
    scrollView.frame = savedFrame
    // ----- Revert to original screen: End

    UIGraphicsEndImageContext()

    return createdImage
}

你们有什么想法?

更新问题:

经过一些测试后,我意识到即使我取消隐藏视图后contentSize也不会改变。我用print("Beginning: \(scrollView.contentSize)")和其他人更新了问题以证明这一点。但是contentSize会更新,如果我使用delay函数来提供它。当我设置contentSize时,似乎这个函数执行得太快,hidden = false无法更新。任何想法如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我在目标C 中遇到过这个问题,所以我已经解决了这个问题

  1. 如果要拍摄屏幕截图,请将滚动视图大小设置为等于其内容大小。
  2. 然后你必须拍摄scrollview的截屏。
  3. 捕获屏幕截图后,像以前一样设置scrollview的大小。
  4. 您必须如此快速地完成此过程。因此,用户无法看到实际发生的情况。
  5. 如果你想看到我可以分享的代码,但它在Objective C中。

    注意:此过程无法捕获滚动视图中可滚动的部分。