gpt4 book ai didi

swiftui - 在 SwiftUI 中将多行文本包装在一个形状内

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

如标题所述,我正在寻找一种在 SwiftUI 中将多行文本包装在形状内的方法(见下图)。我尝试使用 .clipToShape(MyShape()),但这只会使不在形状内的任何文本不可见。

我过去曾使用 UIKit 和排除路径完成过此操作,但我想找到一种使用 SwiftUI 实现相同效果的方法。

如有任何建议,我们将不胜感激。

example image of text clipped to circle

最佳答案

我找到了一种数字方式,但它可能不是最好的方式。

它应该适用于 IOS 和 macOS。我使用 swiftUI 在 macOS 上对其进行了测试。

我们做的第一件事是找出有多少个具有字体大小高度的矩形适合于具有其直径的圆。然后我们计算出它们的宽度。最后一步是为每个矩形抓取适合的字符数量并将它们添加到数组中。通过将孔数组转换回字符串,我们在每个矩形后添加一个“\n”以获得正确的多行对齐方式。

func createCircularText(text: String, verticalSpacing: Double,  circleDiameter: Double, FontSize: Double) -> String {

var Text = text

var circularText = String()

var CountOfWordLines = Int()

var widthOfWordLine = [Int]()

var widthOfWordLineSorted = [Int]()

var array = [String]()

let heigthOfWordLines = FontSize + verticalSpacing


var Dnum = (((1/heigthOfWordLines) * circleDiameter) - 2.0)
Dnum.round(.up)
CountOfWordLines = Int(Dnum)


for n in 1...(CountOfWordLines / 2) {


let num0 = circleDiameter / 2.0
let num1 = pow(num0, 2.0)
let num2 = (Double(n) * heigthOfWordLines)
let num3 = pow(num2,2.0)
let num4 = num1 - num3
let num5 = sqrt(Double(num4))
let num = Int((num5 / 10) * 3)
widthOfWordLine.append(Int(num))

}

widthOfWordLineSorted.append(contentsOf: widthOfWordLine.sorted { $1 > $0 })
widthOfWordLine.removeFirst()
widthOfWordLineSorted.append(contentsOf: widthOfWordLine)
widthOfWordLine.removeAll()

for n in widthOfWordLineSorted {


array.append(String(Text.prefix(n)))

if Text.isEmpty {} else {
let t = Text.dropFirst(n)
Text = String(t)
}
}


circularText = array.joined(separator: "\n")


return circularText
}

在我们看来,我们是这样嵌入函数的:

@State var text = "your text"
@State var CircularText = String()


// body:

ZStack {

Circle().frame(width: 200)

Text(CircularText)
.multilineTextAlignment(.center)

}

.onAppear(perform: {
CircularText = createCircularText(text: text, verticalSpacing: 3.0, circleDiameter: 200, FontSize: 12)
})

我刚刚用 12 号字体对其进行了测试,但它在任何其他字体下的表现都应该很好。

通过更改直径,您会注意到文本变得有点椭圆,要解决此问题,请更改 verticalSpacing。数字越小,圆圈越高,反之亦然。但请随时解决该问题。

另外,请确保您的文字足够长。

enter image description here

关于swiftui - 在 SwiftUI 中将多行文本包装在一个形状内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65684374/

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