子视图 UIImage 在 UIImageView 上消失

时间:2021-01-26 14:13:16

标签: ios swift uiimageview uiimage addsubview

我有一个 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...
}

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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。这应该可行,但强迫任何事情都有潜在的失败并可能导致问题。

相关问题