【问题标题】:UIGraphics, Make a Screenshot Of The Screen But Avoid UI ElementsUIGraphics,制作屏幕截图但避免使用 UI 元素
【发布时间】:2017-08-12 15:32:30
【问题描述】:

构建一个功能,类似于 Snapchat 的贴纸。 制作照片,添加贴纸(表情符号),发布图像。 我当前的视图层次结构是:

  • 主视图
    • 查看用户照片
    • UI 元素视图(“取消/添加贴纸/发布”)+ 贴纸/表情符号也添加到此视图中。

用户照片的 UIImageView,就像在 snapchat 中一样占据整个屏幕。 UI 元素添加在不同的视图中,但位于用户的 UIImageView 之上。

我的查看截图代码:

    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.isOpaque, 0.0)
    view.drawHierarchy(in: view.bounds, afterScreenUpdates: true)
    let img = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    if let imageToData = UIImageJPEGRepresentation(img!, 0.2) {
        //saving imageToData to Firebase.    
    }

但这会获取主视图中的所有内容,包括 UI 元素。

一种选择是限制用户的 UIImageView 用于照片,以便 UI 元素不会覆盖它。然后我们可以对有限的视图进行截图。 但这不是应用程序的用户体验应该是什么。

我想到的另一个选项是使用 UIElements 将用户的照片 UIImageView 放置在视图的顶部。然后将所有表情符号添加到其中。但这将涵盖所有 UI 元素。

如何截取用户的 UIImageView 照片 + emoji - UIElements?

【问题讨论】:

  • 您提供的上述代码中的“视图”是什么?那是您的UIViewControllerview 属性吗?或者,包含 UIImageView + emoji 的用户照片视图?您需要的是一个只有 UIImageView 和表情符号的子视图,并从该子视图创建图像。
  • 'view' - 是 UIViewController 的属性。您建议使用带有表情符号的 UIImageView 子视图。但正如我所提到的,我需要 UIImageView 边缘到边缘。也就是说,如果我有另一个带有 UI 元素的子视图 - 它们最终会出现在用户的 UIImageView 下。如果我错了,请纠正我。

标签: ios iphone swift swift3 uiimageview


【解决方案1】:

根据您对我的评论的回答,您只需按如下方式设置图像层次结构:

  • 主视图 (A)
    • 子视图 (B) 设置为图像和表情符号的边到边拉伸
      • 查看 (D) 用户照片
      • 贴纸/表情符号或任何其他设计元素
    • UI 元素的视图 (C)(“取消/添加贴纸/发布”)

我确实注意到您说您需要边对边的图像视图,我不明白为什么这会成为上述层次结构的问题,除非我遗漏了一些东西,因为您可以使子视图 B 拉伸边到主视图的一侧,然后将图像视图 (D) 设置为边到边拉伸。

这里有一些基于您上面的代码的修改代码。在以下代码中,viewB 是对 B 视图的引用。

UIGraphicsBeginImageContextWithOptions(viewB.bounds.size, viewB.isOpaque, 0.0)
viewB.drawHierarchy(in: viewB.bounds, afterScreenUpdates: true)
let img = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

if let imageToData = UIImageJPEGRepresentation(img!, 0.2) {
    //saving imageToData to Firebase.    
}

【讨论】:

  • 我看到您建议将 UI 元素放在一切之上。那么我的问题是:当我调用 UIGraphicsBeginImageContextWithOptions 时,它是否仍然包含 UI 元素,因为它具有 'view.bounds.size' ?或者有办法用 UI 元素排除顶视图?
  • 只是因为 UI 元素位于图像视图之上,所以不应包含在图像中。由于您只创建了 B 视图及其子视图的图像,因此只有那些会显示。图像的位置(如上/下)无关紧要 - 重要的是层次结构,您只需创建 B 视图及其子视图的图像。请试试这个,看看会发生什么。
  • 那么应该如何配置 UIGraphicsBeginImageContextWithOptions 呢?它仍然是'view.bounds.size',而'view'是viewController的属性吗?或者我应该以某种方式获得带有图像和表情符号的 B 视图而不是“视图”?
  • 我认为您并不完全理解上面的代码的作用:) 基本上,您将整个视图层次结构输出到图像中。由于您现在需要视图 B 的层次结构(而不​​是视图 A - 这是主视图),因此您传递视图 B 的边界并要求视图 B 绘制其层次结构。这对你有意义吗?如果这没有意义,我会添加一些代码......
  • 很高兴为您提供帮助,@Evgeny :) 如果有人还没有回答,我们会重新审视这个问题 - 刚刚醒来......
猜你喜欢
  • 2015-11-13
  • 1970-01-01
  • 1970-01-01
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多