Просмотр исходного кода

Add custom view explorer with snapshot previewing, view controller access, and easy frame setting.

Ryan Olson лет назад: 12
Родитель
Сommit
7d6b10461f

+ 3 - 1
Classes/Object Explorers/FLEXObjectExplorerFactory.m

@@ -13,6 +13,7 @@
 #import "FLEXDictionaryExplorerViewController.h"
 #import "FLEXDefaultsExplorerViewController.h"
 #import "FLEXViewControllerExplorerViewController.h"
+#import "FLEXViewExplorerViewController.h"
 
 @implementation FLEXObjectExplorerFactory
 
@@ -30,7 +31,8 @@
                                                    NSStringFromClass([NSSet class])            : [FLEXSetExplorerViewController class],
                                                    NSStringFromClass([NSDictionary class])     : [FLEXDictionaryExplorerViewController class],
                                                    NSStringFromClass([NSUserDefaults class])   : [FLEXDefaultsExplorerViewController class],
-                                                   NSStringFromClass([UIViewController class]) : [FLEXViewControllerExplorerViewController class]};
+                                                   NSStringFromClass([UIViewController class]) : [FLEXViewControllerExplorerViewController class],
+                                                   NSStringFromClass([UIView class])           : [FLEXViewExplorerViewController class]};
     });
     
     Class explorerClass = [FLEXObjectExplorerViewController class];

+ 13 - 0
Classes/Object Explorers/FLEXViewExplorerViewController.h

@@ -0,0 +1,13 @@
+//
+//  FLEXViewExplorerViewController.h
+//  Flipboard
+//
+//  Created by Ryan Olson on 6/11/14.
+//  Copyright (c) 2014 Flipboard. All rights reserved.
+//
+
+#import "FLEXObjectExplorerViewController.h"
+
+@interface FLEXViewExplorerViewController : FLEXObjectExplorerViewController
+
+@end

+ 117 - 0
Classes/Object Explorers/FLEXViewExplorerViewController.m

@@ -0,0 +1,117 @@
+//
+//  FLEXViewExplorerViewController.m
+//  Flipboard
+//
+//  Created by Ryan Olson on 6/11/14.
+//  Copyright (c) 2014 Flipboard. All rights reserved.
+//
+
+#import "FLEXViewExplorerViewController.h"
+#import "FLEXRuntimeUtility.h"
+#import "FLEXUtility.h"
+#import "FLEXObjectExplorerFactory.h"
+#import "FLEXViewSnapshotViewController.h"
+#import "FLEXPropertyEditorViewController.h"
+
+typedef NS_ENUM(NSUInteger, FLEXViewExplorerRow) {
+    FLEXViewExplorerRowViewController,
+    FLEXViewExplorerRowFrame,
+    FLEXViewExplorerRowPreview
+};
+
+@interface FLEXViewExplorerViewController ()
+
+// Don't clash with UIViewController's view property
+@property (nonatomic, readonly) UIView *viewToExplore;
+
+@end
+
+@implementation FLEXViewExplorerViewController
+
+- (UIView *)viewToExplore
+{
+    return [self.object isKindOfClass:[UIView class]] ? self.object : nil;
+}
+
+
+#pragma mark - Superclass Overrides
+
+- (NSString *)customSectionTitle
+{
+    return @"Shortcuts";
+}
+
+- (NSArray *)customSectionRowCookies
+{
+    NSArray *rowCookies = @[@(FLEXViewExplorerRowPreview),
+                            @(FLEXViewExplorerRowFrame)];
+    
+    if ([FLEXUtility viewControllerForView:self.viewToExplore]) {
+        rowCookies = [@[@(FLEXViewExplorerRowViewController)] arrayByAddingObjectsFromArray:rowCookies];
+    }
+    
+    return rowCookies;
+}
+
+- (NSString *)customSectionTitleForRowCookie:(id)rowCookie
+{
+    NSString *title = nil;
+    if ([rowCookie isEqual:@(FLEXViewExplorerRowViewController)]) {
+        title = @"View Controller";
+    } else if ([rowCookie isEqual:@(FLEXViewExplorerRowFrame)]) {
+        title = @"@property CGRect frame";
+    } else if ([rowCookie isEqual:@(FLEXViewExplorerRowPreview)]) {
+        title = @"Image Preview";
+    }
+    return title;
+}
+
+- (NSString *)customSectionSubtitleForRowCookie:(id)rowCookie
+{
+    NSString *subtitle = nil;
+    if ([rowCookie isEqual:@(FLEXViewExplorerRowViewController)]) {
+        subtitle = [FLEXRuntimeUtility descriptionForIvarOrPropertyValue:[FLEXUtility viewControllerForView:self.viewToExplore]];
+    } else if ([rowCookie isEqual:@(FLEXViewExplorerRowFrame)]) {
+        subtitle = [FLEXUtility stringForCGRect:self.viewToExplore.frame];
+    }
+    return subtitle;
+}
+
+- (BOOL)customSectionCanDrillIntoRowWithCookie:(id)rowCookie
+{
+    return YES;
+}
+
+- (UIViewController *)customSectionDrillInViewControllerForRowCookie:(id)rowCookie
+{
+    UIViewController *drillInViewController = nil;
+    if ([rowCookie isEqual:@(FLEXViewExplorerRowViewController)]) {
+        drillInViewController = [FLEXObjectExplorerFactory explorerViewControllerForObject:[FLEXUtility viewControllerForView:self.viewToExplore]];
+    } else if ([rowCookie isEqual:@(FLEXViewExplorerRowFrame)]) {
+        [FLEXRuntimeUtility addFramePropertyToUIViewIfNeeded];
+        objc_property_t frameProperty = class_getProperty([UIView class], "frame");
+        drillInViewController = [[FLEXPropertyEditorViewController alloc] initWithTarget:self.viewToExplore property:frameProperty];
+    } else if ([rowCookie isEqual:@(FLEXViewExplorerRowPreview)]) {
+        if (!CGRectIsEmpty(self.viewToExplore.bounds)) {
+            CGSize viewSize = self.viewToExplore.bounds.size;
+            UIGraphicsBeginImageContextWithOptions(viewSize, NO, 0.0);
+            if ([self.viewToExplore respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]) {
+                [self.viewToExplore drawViewHierarchyInRect:CGRectMake(0, 0, viewSize.width, viewSize.height) afterScreenUpdates:YES];
+            } else {
+                CGContextRef imageContext = UIGraphicsGetCurrentContext();
+                [self.viewToExplore.layer renderInContext:imageContext];
+            }
+            UIImage *previewImage = UIGraphicsGetImageFromCurrentImageContext();
+            UIGraphicsEndImageContext();
+            drillInViewController = [[FLEXViewSnapshotViewController alloc] initWithImage:previewImage];
+        }
+    }
+    return drillInViewController;
+}
+
+- (BOOL)shouldShowDescription
+{
+    return YES;
+}
+
+@end

+ 15 - 0
Classes/View Hierarchy/FLEXViewSnapshotViewController.h

@@ -0,0 +1,15 @@
+//
+//  FLEXViewSnapshotViewController.h
+//  Flipboard
+//
+//  Created by Ryan Olson on 6/12/14.
+//  Copyright (c) 2014 Flipboard. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface FLEXViewSnapshotViewController : UIViewController
+
+- (id)initWithImage:(UIImage *)image;
+
+@end

+ 91 - 0
Classes/View Hierarchy/FLEXViewSnapshotViewController.m

@@ -0,0 +1,91 @@
+//
+//  FLEXViewSnapshotViewController.m
+//  Flipboard
+//
+//  Created by Ryan Olson on 6/12/14.
+//  Copyright (c) 2014 Flipboard. All rights reserved.
+//
+
+#import "FLEXViewSnapshotViewController.h"
+#import "FLEXUtility.h"
+
+@interface FLEXViewSnapshotViewController () <UIScrollViewDelegate>
+
+@property (nonatomic, strong) UIImage *image;
+
+@property (nonatomic, strong) UIScrollView *scrollView;
+@property (nonatomic, strong) UIImageView *imageView;
+
+@end
+
+@implementation FLEXViewSnapshotViewController
+
+- (id)initWithImage:(UIImage *)image
+{
+    self = [super initWithNibName:nil bundle:nil];
+    if (self) {
+        self.title = @"Preview";
+        self.image = image;
+    }
+    return self;
+}
+
+- (void)viewDidLoad
+{
+    [super viewDidLoad];
+    
+    self.view.backgroundColor = [FLEXUtility scrollViewGrayColor];
+    
+    self.imageView = [[UIImageView alloc] initWithImage:self.image];
+    self.scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
+    self.scrollView.delegate = self;
+    self.scrollView.backgroundColor = self.view.backgroundColor;
+    self.scrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
+    [self.scrollView addSubview:self.imageView];
+    self.scrollView.contentSize = self.imageView.frame.size;
+    self.scrollView.minimumZoomScale = 1.0;
+    self.scrollView.maximumZoomScale = 2.0;
+    [self.view addSubview:self.scrollView];
+    
+    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Copy" style:UIBarButtonItemStylePlain target:self action:@selector(copyButtonPressed:)];
+}
+
+- (void)viewDidLayoutSubviews
+{
+    [self centerContentInScrollViewIfNeeded];
+}
+
+- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
+{
+    return self.imageView;
+}
+
+- (void)scrollViewDidZoom:(UIScrollView *)scrollView
+{
+    [self centerContentInScrollViewIfNeeded];
+}
+
+- (void)centerContentInScrollViewIfNeeded
+{
+    CGFloat horizontalInset = 0.0;
+    CGFloat verticalInset = 0.0;
+    if (self.scrollView.contentSize.width < self.scrollView.bounds.size.width) {
+        horizontalInset = (self.scrollView.bounds.size.width - self.scrollView.contentSize.width) / 2.0;
+    }
+    if (self.scrollView.contentSize.height < self.scrollView.bounds.size.height) {
+        verticalInset = (self.scrollView.bounds.size.height - self.scrollView.contentSize.height) / 2.0;
+    }
+    self.scrollView.contentInset = UIEdgeInsetsMake(verticalInset, horizontalInset, verticalInset, horizontalInset);
+}
+
+- (BOOL)prefersStatusBarHidden
+{
+    return YES;
+}
+
+- (void)copyButtonPressed:(id)sender
+{
+    [[UIPasteboard generalPasteboard] setImage:self.image];
+}
+
+@end