🔥 Весьма удобный и крутой лайфхак, как можно быстро помочь себе в верстке
🧨 Really nice and awesome lifehack how to help yourself with layouts
Думаю, уже все знают про то, как найти размер вьюхи с помощью GeomertyReader, если .frame не задан. Если нет, то я напомню:
Hope everyone already knows how to find the view size using GeomertyReader if .frame is not specified. Don’t worry, I'll remind you:
import SwiftUI
struct SizePreferenceKey: PreferenceKey {
static var defaultValue: CGSize = .zero
static func reduce(value: inout CGSize, nextValue: () -> CGSize) {
value = nextValue()
}
}
struct MeasureSizeModifier: ViewModifier {
func body(content: Content) -> some View {
content.overlay(GeometryReader { geometry in
Color.clear.preference(key: SizePreferenceKey.self,
value: geometry.size)
})
}
}
extension View {
func measureSize(perform action: @escaping (CGSize) -> Void) -> some View {
self.modifier(MeasureSizeModifier.init())
.onPreferenceChange(SizePreferenceKey.self, perform: action)
}
}
Теперь создадим структуру и модификатор, которые будем использовать для отображения границ размера элемента:
Next let's create a struct and modifier for displaying the view size:
import SwiftUI
struct Measurements: View {
@State private var size: CGSize = .zero
let showSize: Bool
let color: Color
var body: some View {
label.measureSize { size = $0 }
}
var label: some View {
ZStack(alignment: .topTrailing) {
Rectangle()
.strokeBorder(
color,
lineWidth: 1
)
Text("H:\(size.height.formatted) W:\(size.width.formatted)")
.foregroundColor(.black)
.font(.system(size: 8))
.opacity(showSize ? 1 : 0)
}
}
}
extension View {
func measured(_ showSize: Bool = true, _ color: Color = Color.red) -> some View {
self
.overlay(Measurements(showSize: showSize, color: color))
}
}
extension CGFloat {
var formatted: String {
abs(self.remainder(dividingBy: 1)) <= 0.001
? .init(format: "%.0f", self)
: .init(format: "%.2f", self)
}
}
extension Double {
var formatted: String {
CGFloat(self).formatted
}
}
А теперь можете сравнить итоговые вьюхи с макетами и проверить на случайные .padding():
That’s all! Now you can compare views in Canvas with the designed in Figma and check on accidental .padding():
YourView()
.measure()
#howto #getsources #groovy
@swiftui_dev