C'est une question assez simple - comment appliquer un effet de bordure uniquement aux bords voulus d'une image avec SwiftUI?
Par exemple, je souhaite uniquement appliquer une bordure aux bords supérieur et inférieur d'une image car l'image occupe toute la largeur de l'écran.
Image(mission.missionImageString) .resizable() .aspectRatio(contentMode: .fit) .border(Color.white, width: 2) //Adds a border to all 4 edges
Toute aide est appréciée!
3 Réponses :
Vous pouvez utiliser ce modificateur sur n'importe quelle View
:
struct EdgeBorder: Shape { var width: CGFloat var edges: [Edge] func path(in rect: CGRect) -> Path { var path = Path() for edge in edges { var x: CGFloat { switch edge { case .top, .bottom, .leading: return rect.minX case .trailing: return rect.maxX - width } } var y: CGFloat { switch edge { case .top, .leading, .trailing: return rect.minY case .bottom: return rect.maxY - width } } var w: CGFloat { switch edge { case .top, .bottom: return rect.width case .leading, .trailing: return self.width } } var h: CGFloat { switch edge { case .top, .bottom: return self.width case .leading, .trailing: return rect.height } } path.addPath(Path(CGRect(x: x, y: y, width: w, height: h))) } return path } }
Avec l'aide de cette simple extension:
extension View { func border(width: CGFloat, edges: [Edge], color: Color) -> some View { overlay(EdgeBorder(width: width, edges: edges).foregroundColor(color)) } }
Et voici la structure magique derrière ceci:
.border(width: 5, edges: [.top, .leading], color: .yellow)
Le code ajoute un espacement qui occupe tout l'espace.
Placer le code "magique" (le bloc dans le body
) à l'intérieur d'une .overlay
de ma forme fonctionne très bien. Merci pour ce code!
Si quelqu'un a besoin d'ajouter simplement une bordure rapide à 1 (ou plus) côté à une vue (par exemple, le bord supérieur ou toute combinaison aléatoire d'arêtes), j'ai trouvé que cela fonctionne bien et est modifiable:
bord supérieur:
.overlay(Rectangle().frame(width: 1, height: nil, alignment: .leading).foregroundColor(Color.gray), alignment: .leading)
bord d'attaque:
.overlay(Rectangle().frame(width: nil, height: 1, alignment: .top).foregroundColor(Color.gray), alignment: .top)
etc.
Ajustez simplement la hauteur, la largeur et le bord pour produire la combinaison de bordures souhaitée.
Similaire à @smakus, si vous n'avez pas besoin de contrôler la couleur ou l'épaisseur, vous pouvez simplement le faire:
.overlay(Divider(), alignment: .top) .overlay(Divider(), alignment: .bottom)