Swiftui: подключите SVG, используя пользовательский путь, но вместо этого получение всего SVGIOS

Программируем под IOS
Ответить
Anonymous
 Swiftui: подключите SVG, используя пользовательский путь, но вместо этого получение всего SVG

Сообщение Anonymous »

Я работаю над проектом Swiftui, где я хочу обрезать SVG, используя пользовательский путь (например, выбор Freeform Lasso). Однако вместо того, чтобы получить только обрезанную часть, я все еще вижу весь SVG. Svg. < /Li>
< /ul>
Проблема: < /strong>
SVG выглядит неизменным даже после применения палата клипа. Я ожидал, что только выбранная часть будет видна, но она, похоже, не работает. < /P>
код: < /p>

Код: Выделить всё

import SwiftUI
import CoreGraphics
import SVGView

struct ScissorsText: View {
@State private var points: [CGPoint] = []
@State private var isDrawing = false
@State private var croppedImage: Image? = nil

@State private var fontSize: CGFloat = 30
@State private var showBorder: Bool = false
@State private var showBorderUpper: Bool = true
@State private var borderWidth: CGFloat = 1
@State private var borderColor: UIColor = .white
@State private var tctNewItem: String = "Draggable"
@State private var currentFontName: String = "Avenir Black"

var body: some View {
ZStack {
VStack {
ZStack {
GeometryReader { geo in
ZStack {
CustomTextView(
fontSize: $fontSize,
showBorder: $showBorder,
borderWidth: $borderWidth,
borderColor: $borderColor,
tctNewItem: $tctNewItem, currentFontName: $currentFontName
)
.frame(width: geo.size.width, height: geo.size.height)
.zIndex(1.0)
}
.frame(height: 400)
.background(.white.opacity(0.1))
.overlay(SelectionPathOverlay2(points: points, isDrawing: isDrawing))
.gesture(DragGesture()
.onChanged { value in
if !isDrawing {
points = [value.location]
isDrawing = true
} else {
points.append(value.location)
}
}
.onEnded { _ in
if points.count > 2 {
points.append(points.first!) // Close the path
}
isDrawing = false
}
)
}

Button(action: {
points.removeAll()
}, label: {
Text("Clear")
.padding(.horizontal, 8)
.padding(.vertical, 5)
.background(.white)
})
.position(x: 350, y: 100)
}
.frame(height: 400)

let fileManager = FileManager.default
let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!
let fileURL = documentsURL.appendingPathComponent("output.svg")

let viewBox = CGRect(x: 0, y: 0, width: 300, height: 300)

if points.count > 0, !isDrawing {
if let clippedSVG = applyClipToSVG(at: fileURL, clipPoints: points, viewBox: viewBox) {
SVGView(string: clippedSVG)
}
}
}
}
.ignoresSafeArea(.all)
.background(.gray)
}

func readSVG(from url: URL) -> String? {
do {
return try String(contentsOf: url, encoding: .utf8)
} catch {
print("Error reading SVG file: \(error)")
return nil
}
}

func applyClipToSVG(at url: URL, clipPoints: [CGPoint], viewBox: CGRect) ->  String? {
guard let originalSVG = readSVG(from: url) else { return nil }
let clipPath = createSVGClipPath(from: clipPoints, viewBox: viewBox)

var modifiedSVG = originalSVG

// Add clipPath to 
if let defsRange = modifiedSVG.range(of: "") {
modifiedSVG.insert(contentsOf: clipPath, at: defsRange.upperBound)
} else {
modifiedSVG = modifiedSVG.replacingOccurrences(
of: "

Подробнее здесь: [url]https://stackoverflow.com/questions/79500093/swiftui-clipping-an-svg-using-a-custom-path-but-getting-the-whole-svg-instead[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»