Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在UILabel的特定字符后面画圆圈_Ios_Swift_Uilabel - Fatal编程技术网

Ios 在UILabel的特定字符后面画圆圈

Ios 在UILabel的特定字符后面画圆圈,ios,swift,uilabel,Ios,Swift,Uilabel,我试图在UILabel字符的特定部分后面画圆圈,而不必使用多个标签或重新计算帧 我知道我可以使用属性文本将图像插入UILabel,但我希望圆圈位于1到9之间的数字后面。我不想存储从1到9的图像。 我也找不到任何能做到这一点的吊舱 let fullText = NSMutableAttributedString() let imageAttachment = NSTextAttachment() imageAttachment.image = UIImage(named:

我试图在UILabel字符的特定部分后面画圆圈,而不必使用多个标签或重新计算帧

我知道我可以使用属性文本将图像插入UILabel,但我希望圆圈位于1到9之间的数字后面。我不想存储从1到9的图像。 我也找不到任何能做到这一点的吊舱

    let fullText = NSMutableAttributedString()

    let imageAttachment = NSTextAttachment()
    imageAttachment.image = UIImage(named: "\(number)_\(color == .yellow ? "yellow" : "gray")")
    let imageString = NSAttributedString(attachment: imageAttachment)
    let endString = NSAttributedString("nouveaux")

    fullString.append(imageString)
    fullString.append(endString)

    mainLabel.attributedText = fullString
编辑

我想在字符串的每个数字后面画一个圆圈。 如果可能的话,我希望它是一个通用工具,如果可能的话,它是一个返回属性字符串的解析器,如果不可能,它是一个唯一的UIView。
另一个用例是4条消息|聊天2 4为黄色,2为灰色

使用UIStackView,设置彩色视图图层的角半径,这非常简单

结果

或在外部堆栈视图中使用两个堆栈视图≥

结果


这是非常简单的使用UIStackView,设置彩色视图图层的角半径

结果

或在外部堆栈视图中使用两个堆栈视图≥

结果


我不明白为什么你不使用一个实用函数来实时绘制圆圈中的数字。这样,您就可以拥有任何您喜欢的数字字体、圆圈大小、数字颜色和圆圈颜色。例如:

func circleAroundDigit(_ num:Int, circleColor:UIColor,
                       digitColor:UIColor, diameter:CGFloat,
                       font:UIFont) -> UIImage {
    precondition((0...9).contains(num), "digit is not a digit")
    let p = NSMutableParagraphStyle()
    p.alignment = .center
    let s = NSAttributedString(string: String(num), attributes:
        [.font:font, .foregroundColor:digitColor, .paragraphStyle:p])
    let r = UIGraphicsImageRenderer(size: CGSize(width:diameter, height:diameter))
    return r.image {con in
        circleColor.setFill()
        con.cgContext.fillEllipse(in:
            CGRect(x: 0, y: 0, width: diameter, height: diameter))
        s.draw(in: CGRect(x: 0, y: diameter / 2 - font.lineHeight / 2,
                          width: diameter, height: diameter))
    }
}
以下是如何使用它:

let im = circleAroundDigit(3, circleColor: .yellow, 
    digitColor: .white, diameter: 30, font:UIFont(name: "GillSans", size: 20)!)
这是生成的图像;但是请注意,只要以不同的方式调用函数,就可以调整此函数的各个方面:

好了,现在你有了一个图像。您说您已经知道如何将图像内联插入属性字符串并将其显示为标签的一部分,因此我将不解释如何执行此操作:


我不明白为什么你不使用一个实用函数来实时绘制圆圈中的数字。这样,您就可以拥有任何您喜欢的数字字体、圆圈大小、数字颜色和圆圈颜色。例如:

func circleAroundDigit(_ num:Int, circleColor:UIColor,
                       digitColor:UIColor, diameter:CGFloat,
                       font:UIFont) -> UIImage {
    precondition((0...9).contains(num), "digit is not a digit")
    let p = NSMutableParagraphStyle()
    p.alignment = .center
    let s = NSAttributedString(string: String(num), attributes:
        [.font:font, .foregroundColor:digitColor, .paragraphStyle:p])
    let r = UIGraphicsImageRenderer(size: CGSize(width:diameter, height:diameter))
    return r.image {con in
        circleColor.setFill()
        con.cgContext.fillEllipse(in:
            CGRect(x: 0, y: 0, width: diameter, height: diameter))
        s.draw(in: CGRect(x: 0, y: diameter / 2 - font.lineHeight / 2,
                          width: diameter, height: diameter))
    }
}
以下是如何使用它:

let im = circleAroundDigit(3, circleColor: .yellow, 
    digitColor: .white, diameter: 30, font:UIFont(name: "GillSans", size: 20)!)
这是生成的图像;但是请注意,只要以不同的方式调用函数,就可以调整此函数的各个方面:

好了,现在你有了一个图像。您说您已经知道如何将图像内联插入属性字符串并将其显示为标签的一部分,因此我将不解释如何执行此操作:


请显示您已经尝试过的内容、没有成功的内容、代码示例等。请阅读,然后您的问题显示了演示问题的最低代码。如果您说1和nouveaux在同一标签中,那么,为什么不将它们分成两个不同的UILabel,并使用cornerRadius制作一个自定义UIView,将标签圆化为一个黄色圆圈?为什么不创建一个自定义UIView,该视图使用核心动画层和单独的标签绘制圆圈和编号。我想这更有效。@Mochi,因为我希望它是通用的,对于给定的模型,可以有0到2个插入点。我想处理字符后面的圆插入,而不必处理4个标签,也不必在运行时更改它们的约束。我希望它是通用的,并在给定字符串的每个数字后面插入圆圈。你能给出其他字符串的例子吗?目前,第一个字符后面看起来只是黄色的圆形视图。请显示您已经尝试过的内容、没有成功的内容、代码示例等。请阅读,然后显示问题的最低代码。如果您说1和nouveaux在同一标签中,那么,为什么不将它们分成两个不同的UILabel,并使用cornerRadius制作一个自定义UIView,将标签圆化为一个黄色圆圈?为什么不创建一个自定义UIView,该视图使用核心动画层和单独的标签绘制圆圈和编号。我想这更有效。@Mochi,因为我希望它是通用的,对于给定的模型,可以有0到2个插入点。我想处理字符后面的圆插入,而不必处理4个标签,也不必在运行时更改它们的约束。我希望它是通用的,并在给定字符串的每个数字后面插入圆圈。你能给出其他字符串的例子吗?现在它看起来就像第一个角色后面的黄色圆形视图。真不错!谢谢你,这就是我所寻找的UIImage构造,给定的标签和字体大小对我来说并不简单。谢谢兄弟,我想在nsmultableString中添加类似图标的反应号,你能帮忙吗?像这样+2icon\u微笑真是太好了!谢谢你,这就是我所寻找的UIImage构造,给定的标签和字体大小对我来说并不简单。谢谢兄弟,我想在nsmultableString中添加类似图标的反应号,你能帮忙吗?像这样+2 CON_微笑