ios - 如何获取带有导航栏的特定 uitableviewcell 屏幕截图?

标签 ios swift uitableview screenshot

我正在尝试获取 uitableviewcell 的屏幕截图,我可以成功地做到这一点。但我无法将导航栏附加到 UIImage 的顶部。

这是我的: https://i.imgur.com/8ULUFg5.jpg

这是我想要得到的: https://i.imgur.com/w0IpoYA.png

如何将导航栏附加到图像?

我尝试创建新的 UIImage 来创建合并图像,但它不起作用。

下面是我正确获取单元格屏幕截图的代码。

        let cell = self.entryView.cellForRow(at: self.indexP) as! entryViewTableCell
        let frame = cell.frame
        let kalan = self.indexP.row % 2
        cell.entryText.backgroundColor = (kalan == 0) ? Theme.cellFirstColor : Theme.cellSecondColor
        cell.entryText.text = ""
        UIGraphicsBeginImageContextWithOptions(cell.entryText.frame.size, true, 2)
        cell.entryText.attributedText = self.entryler[self.indexP.row]
        cell.entryText.textColor = Theme.labelColor
        cell.entryText.tintColor = Theme.linkColor
        cell.entryText.layer.render(in: UIGraphicsGetCurrentContext()!)
        let snapshot = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()

编辑: https://i.imgur.com/OR4gV6L.jpg

我可以用下面的代码得到这张图片,但是导航栏的不透明度太低了。我怎样才能不透明?

        let cell = self.entryView.cellForRow(at: self.indexP) as! entryViewTableCell
        let frame = cell.entryText.frame
        let kalan = self.indexP.row % 2
        cell.entryText.backgroundColor = (kalan == 0) ? Theme.cellFirstColor : Theme.cellSecondColor
        cell.entryText.text = ""
        UIGraphicsBeginImageContextWithOptions(frame.size, true, 2)
        cell.entryText.attributedText = self.entryler[self.indexP.row]
        cell.entryText.textColor = Theme.labelColor
        cell.entryText.tintColor = Theme.linkColor
        cell.entryText.layer.render(in: UIGraphicsGetCurrentContext()!)
        let snapshot = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()

        UIGraphicsBeginImageContextWithOptions((self.navigationController?.navigationBar.layer.frame.size)!, true, 2)
            self.navigationController?.navigationBar.drawHierarchy(in: (self.navigationController?.navigationBar.bounds)!, afterScreenUpdates: false)

            self.navigationController?.navigationBar.layer.render(in: UIGraphicsGetCurrentContext()!)
            let ss = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()

            let img = self.getMixedImg(image1: ss!, image2: snapshot!)


func getMixedImg(image1: UIImage, image2: UIImage) -> UIImage? {

    let size = CGSize(width: image1.size.width, height: image1.size.height + image2.size.height)

    UIGraphicsBeginImageContextWithOptions(size, true, 2)

    image1.draw(in: CGRect(x: 0,y: 0,width: size.width, height: image1.size.height))
    image2.draw(in: CGRect(x: 0,y: image1.size.height,width: size.width, height: image2.size.height))
    let finalImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()

    return finalImage
}

最佳答案

这是我的问题的答案:

let cell = self.entryView.cellForRow(at: self.indexP) as! entryViewTableCell
        let frame = cell.entryText.frame
        let kalan = self.indexP.row % 2
        cell.entryText.backgroundColor = (kalan == 0) ? Theme.cellFirstColor : Theme.cellSecondColor
        cell.entryText.text = ""
        UIGraphicsBeginImageContextWithOptions(frame.size, true, 3)
        cell.entryText.attributedText = self.entryler[self.indexP.row]
        cell.entryText.textColor = Theme.labelColor
        cell.entryText.tintColor = Theme.linkColor
        cell.entryText.layer.render(in: UIGraphicsGetCurrentContext()!)
        let snapshot = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()

        UIGraphicsBeginImageContextWithOptions((self.navigationController?.navigationBar.layer.bounds.size)!, true, 3)
            self.navigationController?.navigationBar.drawHierarchy(in: (self.navigationController?.navigationBar.layer.bounds)!, afterScreenUpdates: false)
            let ss = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()

            let img = self.getMixedImg(image1: ss!, image2: snapshot!)
func getMixedImg(image1: UIImage, image2: UIImage) -> UIImage? {

    let size = CGSize(width: image1.size.width, height: image1.size.height + image2.size.height)

    UIGraphicsBeginImageContextWithOptions(size, true, 2)

    image1.draw(in: CGRect(x: 0,y: 0,width: size.width, height: image1.size.height))
    image2.draw(in: CGRect(x: 0,y: image1.size.height,width: size.width, height: image2.size.height))
    let finalImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()

    return finalImage
}

和结果:https://i.imgur.com/ezcfxnw.jpg

关于ios - 如何获取带有导航栏的特定 uitableviewcell 屏幕截图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57299353/

相关文章:

swift - 相对布局。约束方程解释

ios - 当值为空字符串时,TextField 不显示底线 Material Swift

iOS UITableViewCells 行被回收且标签不起作用

ios - didSelectRowAt 仅在多点触控时调用

c# - Xamarin 支持 Apple TLS(不是 Mono TLS)的 SNI?

iphone - 调用 UIViewController 的另一个 View 不起作用

ios - 通过 CoreBluetooth 成功连接 BLE 后,如何以编程方式连接经典蓝牙

iOS UI - App Store 浏览部分过渡

xcode - 在 Swift 中从 Firebase 获取单独的数据

ios - 以编程方式生成不同的静态 UITableview