Skip to content

Instantly share code, notes, and snippets.

@el-hoshino
Created April 5, 2020 15:40
Show Gist options
  • Save el-hoshino/74456f831c35a458a4ef5215bf70e6b7 to your computer and use it in GitHub Desktop.
Save el-hoshino/74456f831c35a458a4ef5215bf70e6b7 to your computer and use it in GitHub Desktop.
A weird behavior in SwiftUI when using a GeometryReader in a ZStack
import SwiftUI
struct Badge<V: View>: ViewModifier {
let badge: V
func body(content: Content) -> some View {
ZStack {
content
GeometryReader { [self] geometry in
self.badge
.clipShape(Circle())
.offset(x: geometry.size.width / 2, y: geometry.size.height / -4)
}
}.fixedSize()
}
}
extension View {
func speakableBadge1(diameter: CGFloat, color: Color) -> some View {
self.modifier(Badge(badge:
Image(systemName: "radiowaves.right")
.font(Font.system(size: diameter * 0.875))
.frame(width: diameter, height: diameter)
.background(Color.blue.opacity(0.7))
))
}
}
extension View {
private func speakableBadge(diameter: CGFloat, color: Color) -> some View {
Image(systemName: "radiowaves.right")
.font(Font.system(size: diameter * 0.875))
.frame(width: diameter, height: diameter)
.background(Color.blue.opacity(0.7))
}
func speakableBadge2(diameter: CGFloat, color: Color) -> some View {
self.modifier(Badge(badge:
speakableBadge(diameter: diameter, color: color)
))
}
}
struct Badge_Previews: PreviewProvider {
static var previews: some View {
Group {
Text("Hello, World")
.font(Font.system(size: 48))
.speakableBadge1(diameter: 32, color: .blue)
Text("Hello, World")
.font(Font.system(size: 48))
.speakableBadge2(diameter: 32, color: .blue)
}.previewLayout(.fixed(width: 320, height: 320))
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment