在 SwiftUI Mac 应用程序中圆化特定角

Cli*_*rum 2 macos appkit swiftui

我一直在尝试弄清楚如何在Mac 应用程序中圆化SwiftUI 的特定角。我能找到的所有解决方案(例如这个)仅适用于 iOS,因为它具有. 我找不到同等的东西。ViewUIRectCornerNSRectCorner

以前,我会NSView像这样绕过一个特定的角:

layer?.cornerRadius = 5
layer?.maskedCorners = .layerMinXMinYCorner //Bottom-left corner
Run Code Online (Sandbox Code Playgroud)

有没有人找到一种方法可以在 SwiftUI 中的 Mac 应用程序中圆化特定的角?

Chr*_*isR 10

macOS的答案来了:)

\n
// defines OptionSet, which corners to be rounded \xe2\x80\x93 same as UIRectCorner\nstruct RectCorner: OptionSet {\n    \n    let rawValue: Int\n        \n    static let topLeft = RectCorner(rawValue: 1 << 0)\n    static let topRight = RectCorner(rawValue: 1 << 1)\n    static let bottomRight = RectCorner(rawValue: 1 << 2)\n    static let bottomLeft = RectCorner(rawValue: 1 << 3)\n    \n    static let allCorners: RectCorner = [.topLeft, topRight, .bottomLeft, .bottomRight]\n}\n\n\n// draws shape with specified rounded corners applying corner radius\nstruct RoundedCornersShape: Shape {\n    \n    var radius: CGFloat = .zero\n    var corners: RectCorner = .allCorners\n\n    func path(in rect: CGRect) -> Path {\n        var path = Path()\n\n        let p1 = CGPoint(x: rect.minX, y: corners.contains(.topLeft) ? rect.minY + radius  : rect.minY )\n        let p2 = CGPoint(x: corners.contains(.topLeft) ? rect.minX + radius : rect.minX, y: rect.minY )\n\n        let p3 = CGPoint(x: corners.contains(.topRight) ? rect.maxX - radius : rect.maxX, y: rect.minY )\n        let p4 = CGPoint(x: rect.maxX, y: corners.contains(.topRight) ? rect.minY + radius  : rect.minY )\n\n        let p5 = CGPoint(x: rect.maxX, y: corners.contains(.bottomRight) ? rect.maxY - radius : rect.maxY )\n        let p6 = CGPoint(x: corners.contains(.bottomRight) ? rect.maxX - radius : rect.maxX, y: rect.maxY )\n\n        let p7 = CGPoint(x: corners.contains(.bottomLeft) ? rect.minX + radius : rect.minX, y: rect.maxY )\n        let p8 = CGPoint(x: rect.minX, y: corners.contains(.bottomLeft) ? rect.maxY - radius : rect.maxY )\n\n        \n        path.move(to: p1)\n        path.addArc(tangent1End: CGPoint(x: rect.minX, y: rect.minY),\n                    tangent2End: p2,\n                    radius: radius)\n        path.addLine(to: p3)\n        path.addArc(tangent1End: CGPoint(x: rect.maxX, y: rect.minY),\n                    tangent2End: p4,\n                    radius: radius)\n        path.addLine(to: p5)\n        path.addArc(tangent1End: CGPoint(x: rect.maxX, y: rect.maxY),\n                    tangent2End: p6,\n                    radius: radius)\n        path.addLine(to: p7)\n        path.addArc(tangent1End: CGPoint(x: rect.minX, y: rect.maxY),\n                    tangent2End: p8,\n                    radius: radius)\n        path.closeSubpath()\n\n        return path\n    }\n}\n\n// View extension, to be used like modifier:\n// SomeView().roundedCorners(radius: 20, corners: [.topLeft, .bottomRight])\nextension View {\n    func roundedCorners(radius: CGFloat, corners: RectCorner) -> some View {\n        clipShape( RoundedCornersShape(radius: radius, corners: corners) )\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n