Ich möchte ContainerRelativeShape nur auf bestimmte Ecken anwenden [SwiftUI]

In diesem Artikel heißt es, dass Sie die automatische abgerundete Ecke "ContainerRelativeShape", die in iOS 14 angezeigt wurde, nur für bestimmte Ecken verwenden möchten.

Was ist ContainerRelativeShape?

Die Anzahl der Benutzeroberflächen mit abgerundeten Ecken, die für jedes Teil eindeutig sind, nimmt zu, z. B. das iPhone 11-Terminal selbst und das Widget, das in iOS14 angezeigt wurde. Die ContainerRelativeShape zeigt an jeder Stelle den entsprechenden abgerundeten Radius an.

Zweck

Platziere es oben links Wenden Sie ContainerRelativeShape an Erweitern und umrunden Sie die obere linke Ecke!

Ich werde die Umsetzung des Bildes ganz rechts erklären, das dies realisiert hat.

Code

Benutzerdefinierte Form

Verwenden des "Form" -Protokolls Es gibt ein gutes UIRectCorner-Optionsset, das Eckinformationen verarbeitet. Verwenden Sie es also Definieren Sie Ihre eigene ContainerRelativeShapeSpecificCorner-Struktur.

struct ContainerRelativeShapeSpecificCorner: Shape {
    
    private let corners: [UIRectCorner]
    
    init(corner: UIRectCorner...) {
        self.corners = corner
    }
    
    func path(in rect: CGRect) -> Path {
        var p = ContainerRelativeShape().path(in: rect)
        
        if corners.contains(.allCorners) {
            return p
        }
        
        if !corners.contains(.topLeft) {
            p.addPath(Rectangle().path(in: CGRect(x: rect.origin.x, y: rect.origin.y, width: rect.width / 2, height: rect.height / 2)))
        }
        if !corners.contains(.topRight) {
            p.addPath(Rectangle().path(in: CGRect(x: rect.origin.x + rect.width / 2, y: rect.origin.y, width: rect.width / 2, height: rect.height / 2)))
        }
        if !corners.contains(.bottomLeft) {
            p.addPath(Rectangle().path(in: CGRect(x: rect.origin.x, y: rect.origin.y + rect.height / 2, width: rect.width / 2, height: rect.height / 2)))
        }
        if !corners.contains(.bottomRight) {
            p.addPath(Rectangle().path(in: CGRect(x: rect.origin.x + rect.width / 2, y: rect.origin.y + rect.height / 2, width: rect.width / 2, height: rect.height / 2)))
        }
        return p
    }
}

Anwendungsbeispiel

//Ursprünglich
Image("camera")
    .clipShape(ContainerRelativeShape())

//Dieser Typ(Abgerundete Ecken nur für bestimmte Ecken)
Image("camera")
    .clipShape(ContainerRelativeShapeSpecificCorner(corner: .topLeft, .topRight))

//Alle Codebeispiele
struct SampleView: View {
    var body: some View {
        Group {
            Image("camera")
                .resizable()
                .scaledToFill()
                .frame(width: 80, height: 80)
                .clipShape(ContainerRelativeShapeSpecificCorner(corner: .topLeft))
        }
        .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading)
        .padding(8)
    }
}

Recommended Posts

Ich möchte ContainerRelativeShape nur auf bestimmte Ecken anwenden [SwiftUI]
Ich möchte eine bestimmte Datei mit WatchService überwachen
Ich möchte Zeichen konvertieren ...
Ich möchte ein bestimmtes Modell von ActiveRecord ReadOnly erstellen
Ich möchte rekursiv nach Dateien in einem bestimmten Verzeichnis suchen
Ich möchte nur dem Poster Bearbeitungs- und Löschberechtigungen erteilen
Nur daran möchte ich mich erinnern, 4 Entwürfe zum Schreiben von Unit-Tests
[Ruby] Ich möchte nur das ungerade Zeichen in der Zeichenfolge ausgeben
Wenn Rails eine Sitzung für einen bestimmten Controller deaktivieren soll
[Ruby] Ich möchte nur den Wert des Hash und nur den Schlüssel extrahieren
Ich möchte ein schönes build.gradle schreiben
Ich möchte doppelte Fehlermeldungen beseitigen
Ich möchte eine ios.android App machen
Ich möchte DBViewer mit Eclipse 2018-12 verwenden! !!
Ich möchte PHP 7.2 unter Ubuntu 20.04 installieren.
Ich möchte Java-Updates insgesamt stoppen
Ich möchte @Autowired in Servlet verwenden
Ich möchte statische Felder auf @Autowired ausrichten
Ich möchte die Teamentwicklung aus der Ferne durchführen
Entwicklungsnotiz ~ Ich möchte nur das erste Bild anzeigen, das mehrmals gepostet wurde ~
Ich möchte nur die Zeit aus Zeittypdaten abrufen ...! [Strftime] * Zusätzliche Hinweise
Ich möchte immer nur mir selbst zeigen, wer angemeldet ist, was ich gepostet habe
Ich möchte nach Tabulatortrennzeichen mit Rubin sortieren
R von Java ausführen Ich möchte rJava ausführen
[Swift] Ich möchte Gitterlinien (Quadrate) zeichnen.
Ich möchte eine E-Mail in Java senden.
[Ruby] Ich möchte einen Methodensprung machen!
Ich möchte Java8 für jeden mit Index verwenden
Ich möchte den Inhalt der Absicht var_dump
Ich möchte APP_HOME an Logback in Gradle übergeben
Ich möchte eine einfache Wiederholung einer Zeichenkette schreiben
Ich möchte eine Struktur für die Ausnahmebehandlung entwerfen
rsync4j - Ich möchte rsync in Java berühren.
Ich möchte mit Firestore von Rails spielen
Ich möchte irgendwann sogar in Kotlin sein
Ich möchte schnell von Java nach SQLite schreiben
Ich möchte nach dem Dezimalpunkt abschneiden
Ich möchte einfache Fehler reduzieren. Sich selbst befehlen.
Ich möchte die Aggregationsverarbeitung mit Spring-Batch durchführen
[Rails] Ich möchte CSS mit Webpacker laden
Ich möchte eine von Git verwaltete Datei löschen
Ich möchte den Wert in Ruby erhalten
Ich möchte nur das Neueste sehen, da das Docker-Protokoll zu groß geworden ist