summaryrefslogtreecommitdiff
path: root/platform/ios/src/UIView+MGLAdditions.m
blob: 43c54409bd6000fa2437493c99898c84a5439d79 (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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#import "UIView+MGLAdditions.h"

@implementation UIView (MGLAdditions)

- (UIViewController *)mgl_viewControllerForLayoutGuides
{
    // Per -[UIResponder nextResponder] documentation, a UIView’s next responder
    // is its managing UIViewController if applicable, or otherwise its
    // superview. UIWindow’s next responder is UIApplication, which has no next
    // responder.
    UIResponder *laterResponder = self;
    while ([laterResponder isKindOfClass:[UIView class]])
    {
        laterResponder = laterResponder.nextResponder;
    }
    if ([laterResponder isKindOfClass:[UIViewController class]])
    {
        return (UIViewController *)laterResponder;
    }
    return nil;
}

- (NSLayoutYAxisAnchor *)mgl_safeTopAnchor {
    if (@available(iOS 11.0, *)) {
        return self.safeAreaLayoutGuide.topAnchor;
    } else {
        UIViewController *viewController = self.mgl_viewControllerForLayoutGuides;
        BOOL useLayoutGuides = viewController.view && viewController.automaticallyAdjustsScrollViewInsets;
        if (useLayoutGuides) {
            return viewController.topLayoutGuide.bottomAnchor;
        }
        else {
            return self.topAnchor;
        }
    }
}

- (NSLayoutXAxisAnchor *)mgl_safeLeadingAnchor {
    if (@available(iOS 11.0, *)) {
        return self.safeAreaLayoutGuide.leadingAnchor;
    } else {
        return self.leadingAnchor;
    }
}

- (NSLayoutYAxisAnchor *)mgl_safeBottomAnchor {
    if (@available(iOS 11.0, *)) {
        return self.safeAreaLayoutGuide.bottomAnchor;
    } else {
        UIViewController *viewController = self.mgl_viewControllerForLayoutGuides;
        BOOL useLayoutGuides = viewController.view && viewController.automaticallyAdjustsScrollViewInsets;
        if (useLayoutGuides) {
            return viewController.bottomLayoutGuide.topAnchor;
        }
        else {
            return self.bottomAnchor;
        }
    }
}

- (NSLayoutXAxisAnchor *)mgl_safeTrailingAnchor {
    if (@available(iOS 11.0, *)) {
        return self.safeAreaLayoutGuide.trailingAnchor;
    } else {
        return self.trailingAnchor;
    }
}

@end