大佬教程收集整理的这篇文章主要介绍了如何将视图绑定到 swiftui 中的另一个视图?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个应用程序,我正在用一系列楔子创建一个圆,每个楔子都有一个类别标题,应该出现在楔子的顶部。我创建了楔形和一些弯曲的文本,这些文本应该位于圆圈的外边缘。然而,当我改变手机的大小时,文本会随着不同的比例移动。 所以我的问题是如何将文本锚定到圆圈上,以便无论手机大小如何都保持原位?
import SwiftUI
struct WedgeShape: Shape {
let startAngle: Angle
let endAngle: Angle
let linewidth: CGfloat
func path(in rect: CGRect) -> Path {
var p = Path()
let center = CGPoint(x: rect.size.wIDth/2,y: rect.size.wIDth/2)
let r1 = rect.size.wIDth/2
p.addArc(center: center,radius: abs(linewidth - r1),startAngle: startAngle,endAngle: endAngle,clockwise: falsE)
p.addArc(center: center,radius: r1,startAngle: endAngle,endAngle: startAngle,clockwise: truE)
p.closeSubpath()
return p
}
}
struct Wedge {
var startAngle: Double
var endAngle: Double
var color: color
var text: String
var offset: CGSize
var rotaion: Double
var radius: CGfloat
}
struct wedge: VIEw {
@EnvironmentObject var assesmentClass: Assesments
let wedges = [
Wedge(startAngle: -90,endAngle: -45,color: color.yellow,text: "Assess",offset: CGSize(wIDth: -0.0,height: -15.0),rotaion: 25,radius: 135),Wedge(startAngle: -45,endAngle: 0,color: color.red,text: "Paddle Out",offset: CGSize(wIDth: 0.0,height: -20.0),rotaion: 70,radius: 130),Wedge(startAngle: 0,endAngle: 45,color: color.green,text: "position",height: -10.0),rotaion: 110,Wedge(startAngle: 45,endAngle: 90,color: color.blue,text: "Catch",rotaion: 155,Wedge(startAngle: 90,endAngle: 135,color: color.gray,text: "Take Off",rotaion: 205,Wedge(startAngle: 135,endAngle: 180,text: "Pop Up",offset: CGSize(wIDth: 5.0,rotaion: 245,Wedge(startAngle: 180,endAngle: 225,text: "Speed",rotaion: 290,Wedge(startAngle: 225,endAngle: -90,text: "Manouvers",height: -35.0),rotaion: -25,radius: 135)
]
var body: some VIEw {
ZStack {
ForEach(0 ..< wedges.count) {
WedgeShape(
startAngle: Angle(degrees: self.wedges[$0].startAnglE),endAngle: Angle(degrees: self.wedges[$0].endAnglE),linewidth: 44
)
.foregroundcolor(self.wedges[$0].color)
//PIESlice(pIEs: assesmentClass.makePIEs())
CurvedText(text: self.wedges[$0].text,radius: self.wedges[$0].radius,spacing: 2).kerning(1).offset(self.wedges[$0].offset).foregroundcolor(.black).rotationEffect(Angle(degrees: self.wedges[$0].rotaion))
}.scaledToFit()
}
}
}
这是视图的代码,正如您所看到的,我使用了硬编码值的偏移量,我相信这是问题所在,但我不确定如何获取动态值以便动态更改。
>以下是弯曲文本视图的代码。
//
// CurvedText.swift
// ombe_surf
//
// Created by Joby Ingram-Dodd on 09/04/2021.
//
import SwiftUI
private struct TextVIEwSizeKey: PreferenceKey {
static var DefaultValue: [CGSize] { [] }
static func reduce(value: inout [CGSize],nextValue: () -> [CGSize]) {
value.append(contentsOf: nextValue())
}
}
private struct PropagateSize<V: VIEw>: VIEw {
var content: () -> V
var body: some VIEw {
content()
.BACkground(GeometryReader { proxy in
color.clear.preference(key: TextVIEwSizeKey.self,value: [proxy.size])
})
}
}
private struct IDentifiableCharacter: IDentifiable {
var ID: String { "\(indeX) \(character)" }
let index: Int
let character: Character
}
extension IDentifiableCharacter {
var String: String { "\(character)" }
}
extension Array {
subscript(safe index: int) -> Element? {
inDices.contains(indeX) ? self[index] : nil
}
}
// MARK: - Curved Text
public struct CurvedText: VIEw {
public var text: String
public var radius: CGfloat
internal var textModifIEr: (Text) -> Text = { $0 }
internal var spacing: CGfloat = 0
@State private var sizes: [CGSize] = []
private func texTradius(at index: int) -> CGfloat {
radius - size(at: indeX).height / 2
}
public var body: some VIEw {
vstack {
ZStack {
ForEach(textAsCharacters()) { item in
PropagateSize {
self.textVIEw(char: item)
}
.frame(wIDth: self.size(at: item.indeX).wIDth,height: self.size(at: item.indeX).height)
.offset(x: 0,y: -self.texTradius(at: item.indeX))
.rotationEffect(self.angle(at: item.indeX))
}
}
.frame(wIDth: radius * 2,height: radius * 2)
.onPreferenceChange(TextVIEwSizeKey.self) { sizes in
self.sizes = sizes
}
}
.accessibility(label: Text(text))
}
private func textAsCharacters() -> [IDentifiableCharacter] {
let String = String(text.reversed())
return String.enumerated().map(IDentifiableCharacter.init)
}
private func textVIEw(char: IDentifiableCharacter) -> some VIEw {
textModifIEr(Text(char.String))
.rotationEffect(.degrees(180))
}
private func size(at index: int) -> CGSize {
sizes[safe: index] ?? CGSize(wIDth: 1000000,height: 0)
}
private func angle(at index: int) -> Angle {
let arcSpacing = Double(spacing / radius)
let letterWIDths = sizes.map { $0.wIDth }
let prevWIDth =
index < letterWIDths.count ?
letterWIDths.dropLast(letterWIDths.count - indeX).reduce(0,+) :
0
let prevArcWIDth = Double(prevWIDth / radius)
let @R_663_10586@lArcWIDth = Double(letterWIDths.reduce(0,+) / radius)
let prevArcSpacingWIDth = arcSpacing * Double(indeX)
let arcSpacingOffset = -arcSpacing * Double(letterWIDths.count - 1) / 2
let charWIDth = letterWIDths[safe: index] ?? 0
let charOffset = Double(charWIDth / 2 / radius)
let arcCharCenteringOffset = -@R_663_10586@lArcWIDth / 2
let chararcOffset = prevArcWIDth + charOffset + arcCharCenteringOffset + arcSpacingOffset + prevArcSpacingWIDth
return Angle(radians: chararcOffset)
}
}
extension CurvedText {
public func kerning(_ kerning: CGfloat) -> CurvedText {
var copy = self
copy.spacing = kerning
return copy
}
public func italic() -> CurvedText {
var copy = self
copy.textModifIEr = {
self.textModifIEr($0)
.italic()
}
return copy
}
public func bold() -> CurvedText {
FontWeight(.bold)
}
public func FontWeight(_ weight: Font.Weight?) -> CurvedText {
var copy = self
copy.textModifIEr = {
self.textModifIEr($0)
.FontWeight(weight)
}
return copy
}
}
struct CurvedText_PrevIEws: PrevIEwProvIDer {
static var prevIEws: some VIEw {
Group {
CurvedText(text: "Hello World!",radius: 200)
CurvedText(text: "Hello World!",radius: 100)
.kerning(5)
.italic()
.FontWeight(.heavy)
}
.prevIEwLayout(.sizeThatFits)
}
}
这是屏幕截图。
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
以上是大佬教程为你收集整理的如何将视图绑定到 swiftui 中的另一个视图?全部内容,希望文章能够帮你解决如何将视图绑定到 swiftui 中的另一个视图?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。