gpt4 book ai didi

ios - 如何在 UILabel 的文本下绘制东西?

转载 作者:行者123 更新时间:2023-12-01 16:01:59 25 4
gpt4 key购买 nike

我创建了一个自定义 UILabel中间有一个圆圈的子类,标签的文本(这是一个数字)将位于圆圈的顶部。

我最初想用 layer.cornerRadius 来做这个。 ,但是当标签的宽度和高度不相等时,这不会创建一个圆圈。

我的意思是,对于宽度为 100、高度为 50 的标签,我仍然想要一个半径为 50 且中心位于 (50, 25) 的圆。

因此,我尝试使用 UIBezierPath画圆。这是我尝试过的:

override func draw(_ rect: CGRect) {
super.draw(rect)
if bounds.height > bounds.width {
let y = (bounds.height - bounds.width) / 2
let path = UIBezierPath(ovalIn: CGRect(x: 0, y: y, width: bounds.width, height: bounds.width))
circleColor.setFill()
path.fill()
} else {
let x = (bounds.width - bounds.height) / 2
let path = UIBezierPath(ovalIn: CGRect(x: x, y: 0, width: bounds.height, height: bounds.height))
circleColor.setFill()
path.fill()
}
}

我放了 super.draw(rect)因为我认为这会绘制标签的文本,但是当我运行应用程序时,我只看到圆圈而不是我的标签文本。

我很困惑,因为为什么没有 super.draw(rect)绘制标签的文本?

最佳答案

没有看到文本,因为 UIBezierPath 的“z-index” s 取决于它们的绘制顺序。换句话说,UIBezierPath s 被绘制在彼此之上。
super.draw(rect)确实绘制了文本。但是当你把它作为第一个语句时,它会首先被绘制,所以你之后绘制的所有内容都在文本的顶部。要解决此问题,您应该调用 super.draw(rect)最后的:

override func draw(_ rect: CGRect) {
if bounds.height > bounds.width {
let y = (bounds.height - bounds.width) / 2
let path = UIBezierPath(ovalIn: CGRect(x: 0, y: y, width: bounds.width, height: bounds.width))
circleColor.setFill()
path.fill()
} else {
let x = (bounds.width - bounds.height) / 2
let path = UIBezierPath(ovalIn: CGRect(x: x, y: 0, width: bounds.height, height: bounds.height))
circleColor.setFill()
path.fill()
}
super.draw(rect) // <------- here!
}

或者,只是子类 UIView ,在 draw(_:)中画圆, 并添加 UILabel作为一个 subview 。这种方法的优点是它不依赖于 super.draw(_:) 的实现。 , future 可能会改变,

关于ios - 如何在 UILabel 的文本下绘制东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54015404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com