summaryrefslogtreecommitdiffhomepage
path: root/ios/MullvadVPN/Extensions/View+Size.swift
blob: 1e014000ee4e06ec9e13a7eb24ca341e9e0788ee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//
//  View+Size.swift
//  MullvadVPN
//
//  Created by Jon Petersson on 2024-11-14.
//  Copyright © 2025 Mullvad VPN AB. All rights reserved.
//

import SwiftUI

extension View {
    /// Measures view size.
    func sizeOfView(_ onSizeChange: @escaping ((CGSize) -> Void)) -> some View {
        return
            self
            .background {
                GeometryReader { proxy in
                    Color.clear
                        .preference(key: ViewSizeKey.self, value: proxy.size)
                        .onPreferenceChange(ViewSizeKey.self) { size in
                            onSizeChange(size)
                        }
                }
            }
    }
}

private struct ViewSizeKey: PreferenceKey, Sendable {
    nonisolated(unsafe) static var defaultValue: CGSize = .zero

    static func reduce(value: inout CGSize, nextValue: () -> CGSize) {
        value = nextValue()
    }
}