【问题标题】:Subview UIImage disappears on UIImageView子视图 UIImage 在 UIImageView 上消失
【发布时间】:2021-04-30 07:58:34
【问题描述】:

我有一个UIImageView,它在顶部添加了另一个UIImageView 作为子视图,如下所示:

self.imageView.image = UIImage(named: "original_image.png")

let demoStampImage = UIImage(named: "demo_stamp.png")
let frame = CGRect(x: (UIScreen.main.bounds.width / 2) - 50, y: (UIScreen.main.bounds.height / 2) - 50, width: 100, height: 100)
let demoStampImageView = UIImageView(image: demoStampImage)
demoStampImageView.frame = frame
    
self.imageView.addSubview(demoStampImageView)

设置为viewDidLoad,我可以在屏幕上很好地看到它。但后来,当我访问这个self.imageView 分享它时,我只看到没有子视图的原始图像,如下所示。

@objc func shareIt() {
  let imageToShare = [ self.imageView.image ] -> Here image has no subview
  //Code goes on...
}

请帮助我,可能是什么原因以及什么可以解决这个问题?我很感激。

【问题讨论】:

  • 什么是`但是后来,当我访问这个self.imageView来分享它时,我只看到没有子视图的原始图像。`是什么意思?你什么时候再次访问它?请分享所有相关代码
  • 我已经编辑添加我的代码,谢谢指出。
  • 好的.. 第二个UIImageView 在哪里?我只在第一个代码块上看到一个UIImageView,并分配了UIImage,但没有看到第二个UIImageView。?
  • 我也添加了第一部分。它是一个分配了一些随机图像的图像视图。
  • 你说“这里的图像没有子视图”——图像永远不会有子视图,只有UIViews 会有子视图,而不是UIImage。我在下面的回答表明您如何利用 UIImageView 子视图来查找子视图 UIView

标签: ios swift uiimageview uiimage addsubview


【解决方案1】:

添加为子视图并不意味着合并了两个图像。为此,您需要先合并两个图像,或者需要对该图像视图进行截图。

像这样截屏:(注意:图片大小取决于图片视图大小,原始大小需要根据要求计算帧。)

extension UIView {
    func snapImage() -> UIImage {
        return UIGraphicsImageRenderer(size: bounds.size).image { _ in
            drawHierarchy(in: CGRect(origin: .zero, size: bounds.size), afterScreenUpdates: true)
        }
    }
}

@objc func shareIt() {
  let imageToShare = [ self.imageView.snapImage() ]
  //Code goes on...
}

编辑 或者您可以合并两个具有原始大小的图像。像这样

extension UIImage {
    func mearge(image: UIImage) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
        
        self.draw(in: CGRect(x:0 , y: 0, width: size.width, height: size.height))
        let topImageFrame = CGRect(x: (size.width / 2) - 50, y: (size.height / 2) - 50, width: 100, height: 100)
        image.draw(in: topImageFrame)
        
        let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        
        return newImage
    }
}


@objc func shareIt() {
    let imageToShare = [ self.imageView.image!.mearge(image:demoStampImage!) ]
  //Code goes on...
}

查看更多关于合并/合并 2 张图片的信息:here

【讨论】:

  • 这会降低共享图像的质量/分辨率吗?因为它毕竟是一个截图。
  • 是的,为了更好的方式检查最后一个链接。
  • 我检查了附件。接受的答案实际上是在做我几乎在这里做的事情。大多数投票的答案适用于我的案例,但我在调整图像大小时遇到​​问题(可能不适用于我的案例),因此,最后会有一个奇怪的布局。你知道它如何可以很好地布局吗?
  • @UmitKaya 请附上所需的图片。
  • ibb.co/B6QK06P 是我想要的图像。白色标志是子视图,背景是原始图像。我想分享它,就像在这里看到的那样。但是当我访问 self.imageView.image;白色标志消失。顺便说一句,我刚刚看到你的更新,现在我要试试。谢谢。
【解决方案2】:
self.imageView = UIImageView()
self.imageView.image = UIImage(named: "original_image.png")

let demoStampImage = UIImage(named: "demo_stamp.png")
let frame = CGRect(x: (UIScreen.main.bounds.width / 2) - 50, y: (UIScreen.main.bounds.height / 2) - 50, width: 100, height: 100)
let demoStampImageView = UIImageView(image: demoStampImage)
demoStampImageView.tag = 1 //Define tag to find it later
demoStampImageView.frame = frame
    
self.imageView.addSubview(demoStampImageView)
let imageViewSubviews = self.imageView.subviews.filter{$0.tag == 1}
let demoStampImageView = imageViewSubviews[0] as! UIImageView//This is the only view with tag == 1
let demoImage = demoStampImageView.image

请理解我将类型大小写强制为UIImageView 而不进行错误处理。这应该可行,但强制任何事情都有潜在的失败并可能导致问题。

【讨论】:

  • 为什么会这样?您已经有了 demoStampImageView 图像视图对象。我认为不需要添加和检索。
  • demoStampImageView 最后也是一个 UIView,它只是子视图。您将如何在“let imageToShare = [ self.imageView.image ]”中使用它来获得预期的最终图像?它实际上并没有解决问题。
  • 我添加了获取演示图像的方法。
  • 另外,这获取的是原始图像,而不是快照。
  • demoStampImageView 是一个 UIView。如何从 UIView 获取图像?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多