如何为SwiftUI arc添加阴影?

我有以下弧形:

struct Arc : Shape
{
    @Binding var endAngle: Double
    var center: CGPoint
    var radius: CGFloat
    func path(in rect: CGRect) -> Path
    {
        var path = Path()

        path.addArc(center: center,radius: radius,startAngle: .degrees(270),endAngle: .degrees(endAngle),clockwise: false)

        return path.strokedPath(.init(lineWidth: 50,lineCap: .round))
    }
}

如何添加阴影(类似于Apple Watch上的活动弧线),以便在整个圆处仍可以识别endAngle?

编辑: 在360度以上(如此完整的圆)存在另一个问题,即两个弧的两端都合并在一起并显示为一条径向线(我看到了这是因为我已经应用了AngularGradient)。当然,Arc不会像Apple Watch弧线那样进行诸如继续超过startAngle位置这样的高级操作。但这就是我想要的。有人知道如何在SwiftUI中做到这一点吗?

fanabcdefg 回答:如何为SwiftUI arc添加阴影?

enter image description here这是什么?好的...有点“棘手”

import SwiftUI

    struct Arc : Shape
    {
    @Binding var startAngle: Double
    @Binding var endAngle: Double

    var center: CGPoint
    var radius: CGFloat
    var color: Color

    func path(in rect: CGRect) -> Path
    {
        var path = Path()

        let cgPath = CGMutablePath()
        cgPath.addArc(center: CGPoint(x: rect.midX,y: rect.midY),radius: radius,startAngle: CGFloat(startAngle),endAngle: CGFloat(endAngle),clockwise: true)

      //  path.addArc(center: center,startAngle: .degrees(270),endAngle: .degrees(endAngle),clockwise: false)

        path = Path(cgPath)

        return path.strokedPath(.init(lineWidth: 50,lineCap: .round))
    }
}

struct ContentView: View {
    var body: some View {
        ZStack() {
       //     Arc(endAngle: .constant(269),center: CGPoint(x: 200,y: 200),radius: 150,color: .red).foregroundColor(.red).opacity(0.2)
            Arc(startAngle: .constant(80 + 271),endAngle: .constant(80 + 271 + 340),center: CGPoint(x: 205,y: 205),color: .red).foregroundColor(.red)//.shadow(color: .black,radius: 5,x: -30,y: -170)
            Arc(startAngle: .constant(90),endAngle: .constant(80 + 270),color: .red).foregroundColor(.red).shadow(color: .black,x: -114,y: -230)
        }.background(Color.black)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
,

你的意思是这样吗?

struct Arc : Shape
{
    @Binding var endAngle: Double

    var center: CGPoint
    var radius: CGFloat
    var color: Color

    func path(in rect: CGRect) -> Path
    {
        var path = Path()

        path.addArc(center: center,clockwise: false)

        return path.strokedPath(.init(lineWidth: 50,lineCap: .round))
    }
}

struct ContentView: View {
    var body: some View {
        ZStack() {
            Arc(endAngle: .constant(269),color: .red).foregroundColor(.red).opacity(0.2)
            Arc(endAngle: .constant(90),color: .red).foregroundColor(.red)
        }
    }
}
,

嗨,您可以通过在项目文件中编写扩展名来修复和处理所有这些功能

    import UIKit
extension UIView {
func roundCorners(corners: UIRectCorner,radius: CGFloat) {
    let path = UIBezierPath(roundedRect: self.bounds,byRoundingCorners: corners,cornerRadii: CGSize(width: radius,height: radius))
    let mask = CAShapeLayer()
    mask.path = path.cgPath
    self.layer.mask = mask
}

// MARK: Shadow extension UIView {

func dropShadow(scale: Bool = true) {
    layer.masksToBounds = false
    layer.shadowColor = UIColor.blue.cgColor
    layer.shadowOpacity = 1.0
    layer.shadowOffset = CGSize(width: -1.5,height: 3)
    layer.shadowRadius = 3

    layer.shadowPath = UIBezierPath(rect: bounds).cgPath
    layer.shouldRasterize = true
    layer.rasterizationScale = scale ? UIScreen.main.scale : 1
}

func dropShadow(color: UIColor,opacity: Float = 0.5,offSet: CGSize,radius: CGFloat = 1,scale: Bool = true) {
    layer.masksToBounds = false
    layer.shadowColor = color.cgColor
    layer.shadowOpacity = opacity
    layer.shadowOffset = offSet
    layer.shadowRadius = radius

    layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath
    layer.shouldRasterize = true
    layer.rasterizationScale = scale ? UIScreen.main.scale : 1
}

func setAnchorPoint(_ point: CGPoint) {
    var newPoint = CGPoint(x: bounds.size.width * point.x,y: bounds.size.height * point.y)
    var oldPoint = CGPoint(x: bounds.size.width * layer.anchorPoint.x,y: bounds.size.height * layer.anchorPoint.y)

    newPoint = newPoint.applying(transform)
    oldPoint = oldPoint.applying(transform)

    var position = layer.position

    position.x -= oldPoint.x
    position.x += newPoint.x

    position.y -= oldPoint.y
    position.y += newPoint.y

    layer.position = position
    layer.anchorPoint = point
}

class func fromNib<T: UIView>() -> T {
    guard let view = Bundle.main.loadNibNamed(String(describing: T.self),owner: nil,options: nil)?.first as? T else { fatalError() }
    return view
}

现在在情节提要中您可以处理阴影 或者您不想这样做,而且太多了,您可以只使用所需的部分。

本文链接:https://www.f2er.com/3133429.html

大家都在问