在 UIImage 上添加 TextViews - Swift - 以编程方式

Posted

技术标签:

【中文标题】在 UIImage 上添加 TextViews - Swift - 以编程方式【英文标题】:Adding TextViews over UIImage - Swift - Programmatically 【发布时间】:2020-10-06 12:26:35 【问题描述】:

我有一个为我提供分辨率为 1920x1080 的 UIImage 的相机,我已经实现了一个系统,我可以将 UITextViews 添加为子视图,我的目标是将它们添加到原始 UIImage 并导出分辨率为 1920x1080 的最终图像。

所以我一直在考虑的程序是这样的:

    我在 view.frame 上添加了 upperView,它负责绘制屏幕上存在的所有 textView。

    然后我想在原始 UIImage 上按比例添加这个视图

这是我实现的代码:

func passingAndDrawingTextViews(textViews : [UITextView], viewPassed : UIView, inImage : UIImage) -> UIImage
    
    let scale = UIScreen.main.scale
    
    UIGraphicsBeginImageContextWithOptions(viewPassed.frame.size, false, scale)
    
    viewPassed.draw(CGRect(x: 0, y: 0, width: viewPassed.frame.width, height: viewPassed.frame.height))
    
    //adding each textView
    textViews.forEach  (textView) in
        let textColor = textView.textColor
        let textFont = UIFont(name: textView.font!.fontName, size: textView.font!.pointSize)
        let textAlignment = textView.textAlignment
        //alignment of the text
        let paragraphStyle: NSMutableParagraphStyle = NSMutableParagraphStyle()
        paragraphStyle.alignment = textAlignment
        
        let textFontAttributes = [
            NSAttributedString.Key.font: textFont,
            NSAttributedString.Key.foregroundColor: textColor,
            NSAttributedString.Key.paragraphStyle : paragraphStyle,
        ]
        
        
        let rect = CGRect(x: textView.frame.minX + textView.textContainer.lineFragmentPadding, y: textView.frame.minY + textView.textContainerInset.top, width: textView.frame.width, height: textView.frame.height)
        
        textView.text.draw(in: rect, withAttributes: textFontAttributes as [NSAttributedString.Key : Any])
    
    

    
    
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    
    UIGraphicsEndImageContext()
    
    
    UIGraphicsBeginImageContext(inImage.size)
    
    let rect = CGRect(x: 0, y: 0, width: inImage.size.width, height: inImage.size.height)
    inImage.draw(in: CGRect(x: 0, y: 0, width: inImage.size.width, height: inImage.size.height))
    newImage!.draw(in: rect)
    let result = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    
    return result!
    

在函数中我分别传递了textViews列表、upperView和originalImage。

但问题是我得到的 textView 在 x 轴上被拉伸了。我不知道为什么会这样。

我得到了什么:

我想要什么

【问题讨论】:

【参考方案1】:

您在此行中传递的矩形:

newImage!.draw(in: rect)

实际上是它自己的屏幕大小,因此图像会伸展以填充此矩形。 所以做这个:

let rect = CGRect(x: 0, y: 0, width: inImage.size.width, height: inImage.size.height)

你传入的图片的大小。

【讨论】:

我看不出你建议的代码和我正在实施的代码有什么不同 将值更改为您的 newImage 实际大小。让它 rect = CGRect(x: 0, y: 0, width: 300, height: 200) 并检查差异。

以上是关于在 UIImage 上添加 TextViews - Swift - 以编程方式的主要内容,如果未能解决你的问题,请参考以下文章

TextViews 不显示在 Android 中

在 UIImage 上添加 UIView - swift - 以编程方式

将LinearLayout添加到ConstraintLayout时,TextViews消失

以编程方式添加UIImage时,不能在类型上使用实例成员

textViewDidBeginEditing 快速在 2 个单独的 textViews 上

将 UIImage 作为“刻度线”添加到 UISlider