从文本创建图像(大小不正确)

Posted

技术标签:

【中文标题】从文本创建图像(大小不正确)【英文标题】:Create image from text (incorrect size) 【发布时间】:2016-12-12 16:29:42 【问题描述】:

我正在从 UIlablelUIView 子类中的文本创建图像。 UIlablel 的文本设置在 awakeFromNib 中,并且每次应用启动时都会有所不同。图像捕获整个UIlablel 文本的唯一位置是layoutSubviews —> 由于我相信帧大小。请注意,在下面的代码中,我依赖标签父视图上的bounds。问题是layoutSubviews 被多次调用,因此该图像可能会被创建多次。我尝试在didMoveToWindow等地方抓图,但是只抓到了UIlablel的一部分文字。这是制作图像的代码:有什么想法吗?

func createImage(withText text: NSAttributedString, inParent parent: UIView) -> UIImage 
    UIGraphicsBeginImageContextWithOptions(frame.size, false, 0)
    text.draw(in: parent.bounds)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return image!

【问题讨论】:

你能检查一下 parent.bounds 和 frame 的大小和来源吗? 保存一次UILabel中的文本,然后每次layoutSubview调用时重绘UIImage。 【参考方案1】:

问题是 layoutSubviews 被多次调用,所以这个图像可能会被创建多次

但这就是为什么你得到了if 声明,这样你就可以确保图像只被创建一次

var createdImage = false
func createImage( ... 
    if !createdImage 
        createdImage = true
        // create image
    

【讨论】:

这就是为什么亚光是亚光,谢谢!我正在做与此类似的事情,但我的代码需要进行一些认真的重构,这让我觉得它比原本应该做的更困难。【参考方案2】:

我通常使用另一个变量来知道是否调用了 layoutSubviews。

var layoutInvoked = false

func layoutSubviews () -> (Void)

    super.layoutSubviews()
    if layoutInvoked == false
    
        layoutInvoked = true
        // Do your stuff
    

我不知道是否有更简单的方法,但是这个对我有用。

【讨论】:

以上是关于从文本创建图像(大小不正确)的主要内容,如果未能解决你的问题,请参考以下文章

C#WPF - 创建自定义控件。不确定如何正确对齐文本

TableView 的 QML 大小不正确

Swift Parse - UITableViewAutomaticDimension 从解析下载图像时它们的大小不正确,直到我滚动

如何让这个表单和按钮在响应式设计中正确调整大小?

UIScrollView 内的自动布局 UITextView 大小不正确

启动图像大小不正确