【问题标题】: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。

标签: ios swift uiview 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
    }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多