程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何将视图绑定到 swiftui 中的另一个视图?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何将视图绑定到 swiftui 中的另一个视图??

开发过程中遇到如何将视图绑定到 swiftui 中的另一个视图?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何将视图绑定到 swiftui 中的另一个视图?的解决方法建议,希望对你解决如何将视图绑定到 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)
    }
}

这是屏幕截图。

如何将视图绑定到 swiftui 中的另一个视图?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

大佬总结

以上是大佬教程为你收集整理的如何将视图绑定到 swiftui 中的另一个视图?全部内容,希望文章能够帮你解决如何将视图绑定到 swiftui 中的另一个视图?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:swiftui