从屏幕截图中排除视图

时间:2016-03-13 07:17:31

标签: ios swift view screenshot

这就是我截取观点的截图:

UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0)
view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)
let img = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

但是,在视图中,我想从屏幕截图中排除UIVisualEffectsView 我尝试在截取屏幕截图之前隐藏UIVisualEffectsView并在之后取消隐藏它但我不希望用户看到该过程。 (如果我只是隐藏视图,他会这样做,因为iPad太慢而且看起来屏幕闪烁......)

有什么想法吗?提前谢谢!

4 个答案:

答案 0 :(得分:5)

我会利用snapshotViewAfterScreenUpdates()方法

  

此方法可以非常有效地捕获视图的当前呈现外观,并使用它来构建新的快照视图。您可以将返回的视图用作应用中当前视图的可视替代。

因此,您可以使用它来向用户显示完整未更改的视图层次结构的叠加层UIView,同时渲染层次结构的版本,并在其下方进行更改。

唯一需要注意的是,如果要捕获视图控制器的层次结构,则必须创建“内容视图”子视图,以防止在屏幕截图中呈现叠加视图,您可以在其中对层次结构。然后,您需要将要渲染的视图层次结构添加到此“内容视图”。

因此,您的视图层次结构将看起来像这样:

UIView // <- Your view
    overlayView // <- Only present when a screenshot is being taken
    contentView // <- The view that gets rendered in the screenshot
        view(s)ToHide // <- The view(s) that get hidden during the screenshot

虽然,如果您能够overlayView添加到视图的超级视图中 - 而不是视图本身 - 您根本不需要考虑层次结构。例如:

overlayView // <- Only present when a screenshot is being taken
UIView // <- Your view – You can render this in the screenshot
    view(s)ToHide // <- The view(s) that get hidden during the screenshot
    otherViews // <- The rest of your hierarchy

这样的事情应该达到预期的效果:

// get a snapshot view of your content
let overlayView = contentView.snapshotViewAfterScreenUpdates(true)

// add it over your view
view.addSubview(overlayView)

// do changes to the view heirarchy
viewToHide.hidden = true

// begin image context
UIGraphicsBeginImageContextWithOptions(contentView.frame.size, false, 0.0)

// render heirarchy
contentView.drawViewHierarchyInRect(contentView.bounds, afterScreenUpdates: true)

// get image and end context
let img = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

// reverse changes to the view heirarchy
viewToHide.hidden = false

// remove the overlay view
overlayView.removeFromSuperview()

答案 1 :(得分:1)

哦,实际上,只需遵循代码(swift 4)即可。也就是说,创建一个上下文,并在快照中添加所需的项目。无需在真实屏幕中添加视图。

注意:currentView是一个快照基于视图的快照,它将是整个屏幕的视图。 addViews是您要添加的视图。

func takeSnapShot(currentView: UIView , addViews: [UIView], hideViews: [UIView]) -> UIImage {


    for hideView in hideViews {
        hideView.isHidden = true
    }

    UIGraphicsBeginImageContextWithOptions(currentView.frame.size, false, 0.0)

    currentView.drawHierarchy(in: currentView.bounds, afterScreenUpdates: true)
    for addView in addViews{
        addView.drawHierarchy(in: addView.frame, afterScreenUpdates: true)
    }

    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    for hideView in hideViews {
        hideView.isHidden = false
    }

    return image!
}

答案 2 :(得分:0)

也许最简单的解决方案是不要将您不想要的视图包含在截屏视图的层次结构中。你可以简单地把它放在它上面。

答案 3 :(得分:0)

实际上有一种简单的方法可以做到这一点。

例如,我们在故事板中有一个分享按钮和视图,并在下面的示例代码中使用它进行处理。

 @IBAction func share(_ sender: Any) {
  self.hideView.isHidden = true
  let bounds = UIScreen.main.bounds
  UIGraphicsBeginImageContextWithOptions(bounds.size, true, 0.0)
  self.view.drawHierarchy(in: bounds, afterScreenUpdates: true)
  let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
  //Add Activity view controller to use it
  self.hideView.isHidden = false
}

如果使用我的分享按钮截取的屏幕截图对我有用,我就用它来隐藏广告。

afterScreenUpdates: true 在这里用于隐藏以在您单击按钮时查看。它会隐藏几毫秒的 hideView 并截取屏幕截图,然后它会像从未隐藏一样显示回您的视图。

*这是我的第一个回答,希望对大家有所帮助。

谢谢。