1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- //
- // UIWindow+AHKAdditions.m
- // AHKActionSheetExample
- //
- // Created by Arkadiusz on 14-04-14.
- // Copyright (c) 2014 Arkadiusz Holko. All rights reserved.
- //
- #import "UIWindow+AHKAdditions.h"
- #define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
- @implementation UIWindow (AHKAdditions)
- #pragma mark - Public
- - (UIViewController *)ahk_viewControllerForStatusBarStyle
- {
- UIViewController *currentViewController = [self currentViewController];
- while ([currentViewController childViewControllerForStatusBarStyle]) {
- currentViewController = [currentViewController childViewControllerForStatusBarStyle];
- }
- return currentViewController;
- }
- - (UIViewController *)ahk_viewControllerForStatusBarHidden
- {
- UIViewController *currentViewController = [self currentViewController];
- while ([currentViewController childViewControllerForStatusBarHidden]) {
- currentViewController = [currentViewController childViewControllerForStatusBarHidden];
- }
- return currentViewController;
- }
- - (UIImage *)ahk_snapshot
- {
- // source (under MIT license): https://github.com/shinydevelopment/SDScreenshotCapture/blob/master/SDScreenshotCapture/SDScreenshotCapture.m#L35
- // UIWindow doesn't have to be rotated on iOS 8+.
- BOOL ignoreOrientation = SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0");
- UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
- CGSize imageSize = CGSizeZero;
- if (UIInterfaceOrientationIsPortrait(orientation) || ignoreOrientation) {
- imageSize = [UIScreen mainScreen].bounds.size;
- } else {
- imageSize = CGSizeMake([UIScreen mainScreen].bounds.size.height, [UIScreen mainScreen].bounds.size.width);
- }
- UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0);
- CGContextRef context = UIGraphicsGetCurrentContext();
- CGContextSaveGState(context);
- CGContextTranslateCTM(context, self.center.x, self.center.y);
- CGContextConcatCTM(context, self.transform);
- CGContextTranslateCTM(context, -self.bounds.size.width * self.layer.anchorPoint.x, -self.bounds.size.height * self.layer.anchorPoint.y);
- // correct for the screen orientation
- if (!ignoreOrientation) {
- if (orientation == UIInterfaceOrientationLandscapeLeft) {
- CGContextRotateCTM(context, (CGFloat)M_PI_2);
- CGContextTranslateCTM(context, 0, -imageSize.width);
- } else if (orientation == UIInterfaceOrientationLandscapeRight) {
- CGContextRotateCTM(context, (CGFloat)-M_PI_2);
- CGContextTranslateCTM(context, -imageSize.height, 0);
- } else if (orientation == UIInterfaceOrientationPortraitUpsideDown) {
- CGContextRotateCTM(context, (CGFloat)M_PI);
- CGContextTranslateCTM(context, -imageSize.width, -imageSize.height);
- }
- }
- if([self respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]) {
- [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:NO];
- } else {
- [self.layer renderInContext:UIGraphicsGetCurrentContext()];
- }
- CGContextRestoreGState(context);
- UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- return image;
- }
- #pragma mark - Private
- - (UIViewController *)currentViewController
- {
- UIViewController *viewController = self.rootViewController;
- while (viewController.presentedViewController) {
- viewController = viewController.presentedViewController;
- }
- return viewController;
- }
- @end
|